Scott Miller
Scott Miller

Reputation: 2308

In a method that take multiple optional parameters, how can any but the first be specified?

I have a method like this:

def foo(fruit='apple', cut="sliced", topping="ice cream")
  # some logic here
end

How can I call it where I only override the topping parameter but use the default values for the others, something like this

foo('','','hot fudge')

Of course this does not work as intended, but I want to only provide a value for the third optional parameter, and have the first two stick with their default values. I know how to do this with a hash, but is their a shortcut way to do it, using the above syntax?

Upvotes: 12

Views: 13475

Answers (3)

sheldonh
sheldonh

Reputation: 2724

As of Ruby 2.0, you can use keyword arguments:

def foo(fruit: 'apple', cut: "sliced", topping: "ice cream")
  [fruit, cut, topping]
end

foo(topping: 'hot fudge') # => ['apple', 'sliced', 'hot fudge']

Upvotes: 30

rampion
rampion

Reputation: 89053

You can't use this syntax to do this in ruby. I would recommend the hash syntax for this.

def foo(args={})
  args[:fruit]    ||= 'apple'
  args[:cut]      ||= 'sliced'
  args[:topping]  ||= 'ice cream'
  # some logic here
end

foo(:topping => 'hot fudge')

You could also do this using positional arguments:

def foo(fruit=nil,cut=nil,topping=nil)
  fruit    ||= 'apple'
  cut      ||= 'sliced'
  topping  ||= 'ice cream'
  # some logic here
end

foo(nil,nil,'hot fudge')

Bear in mind that both of these techniques prevent you from passing actual nil arguments to functions (when you might want to sometimes)

Upvotes: 18

mpen
mpen

Reputation: 282865

No. You have to check the value of the parameters inside function foo. If they are the empty string, or null, you can set them to the default parameter.

Upvotes: 2

Related Questions