Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing absent parameters

Tags:

ruby

I have seen a particular code smell with default parameters. That is when a method has a default value set for one of its params but the caller passes nil instead of passing no value. In most cases, this is because the caller has a hash and it tries to pass a particular value from the hash. Specifically:

def foo(params)
  ...
  bar(params[:first], params[:second]) # :second doesn't exist
end

def bar(first, second = 2)
end

The second param to foo doesn't not become the default value but becomes nil. The most common way I have seen this handled is that the first line within the function bar is:

second ||= 2 

Is there a better way of handling this? That is, whenever nil or no param gets passed, assign a default value.

like image 872
HeretoLearn Avatar asked Jan 12 '23 16:01

HeretoLearn


1 Answers

def bar(first, second = 2)

This sets second to 2 if the argument omitted. nil is a value with a meaning, so passing nil as the value for argument is explicitly telling it to be nil. This is on purpose, so you can override the default with nil if you want.

If you want your argument to assign a default if it is omitted or nil, then ||= is the idiomatic way to do it.

def bar(first, second = nil)
  second ||= 2
  puts second
end

bar 1      #=> 2
bar 1, 3   #=> 3
bar 1, nil #=> 2

the second = nil allows you to omit the argument, and assigns a default of nil. And if the argument is nil you can set it to a real default. This means that passing in nil and omitting the argument is now essentially the same thing.

It doesn't behave this way universally because sometime you want to replace a default argument with nil. And the way default arguments works allows you to do just that.

like image 154
Alex Wayne Avatar answered Jan 24 '23 14:01

Alex Wayne