62

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
0

3 Answers 3

113
def some_func(variable = nil)
  ...
end
2
  • 7
    Then, of course, one has to somehow differentiate between default nil and explicit nil (if it matters) :) Commented Mar 2, 2016 at 13:00
  • 8
    That's what the def some_func(variable = (variable_was_not_passed = true; nil)) idiom is for. Commented Mar 2, 2016 at 19:51
21

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
2
  • what is the purpose of using *arg and **arg instead of just arg? Commented Mar 2, 2016 at 13:47
  • 7
    @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.
    – bogl
    Commented Mar 2, 2016 at 14:07
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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.