A method with an optional parameter
Asked Answered
F

3

61

Is there a way to make a method that can accept a parameter, but can also be called without one, in which case the parameter is regarded nil like the following?

some_func(variable)

some_func
Flashbulb answered 2/3, 2016 at 12:57 Comment(0)
S
111
def some_func(variable = nil)
  ...
end
Spathose answered 2/3, 2016 at 12:58 Comment(2)
Then, of course, one has to somehow differentiate between default nil and explicit nil (if it matters) :)Spain
That's what the def some_func(variable = (variable_was_not_passed = true; nil)) idiom is for.Sixteenth
P
20

Besides the more obvious option of parameters with default values, that Sawa has already shown, using arrays or hashes might be handy in some cases. Both solutions preserve nil as a an argument.

1. Receive as array:

def some_func(*args)
  puts args.count
end

some_func("x", nil)
# 2

2. Send and receive as hash:

def some_func(**args)
  puts args.count
end

some_func(a: "x", b: nil)
# 2
Pitching answered 2/3, 2016 at 13:15 Comment(2)
what is the purpose of using *arg and **arg instead of just arg?Noblenobleman
@sagarpandya82 *arg collects the arguments as an array. Without the * you would have to call some_func(["x", nil]). **arg collects all named arguments. Without the ** it would only accept either a single unnamed argument, or any number of named arguments.Pitching
C
11

You can also use a hash as argument and have more freedom:

def print_arg(args = {})
  if args.has_key?(:age)
    puts args[:age]
  end
end

print_arg 
# => 
print_arg(age: 35, weight: 90)
# => 35
Culex answered 2/3, 2016 at 13:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.