传递缺席参数

时间:2013-08-10 00:03:04

标签: ruby

我看到了默认参数的特定代码味道。也就是说,当一个方法为其中一个参数设置了默认值但调用者传递nil而不传递任何值时。在大多数情况下,这是因为调用者有一个哈希值,它试图从哈希值中传递一个特定的值。具体做法是:

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

def bar(first, second = 2)
end

foo的第二个参数不会成为默认值,而是变为nil。我看到这种处理的最常见方式是功能栏中的第一行是:

second ||= 2 

有没有更好的方法来处理这个?也就是说,只要传递nil或没有param,就指定一个默认值。

1 个答案:

答案 0 :(得分:8)

def bar(first, second = 2)

如果省略参数,则将second设置为2nil是一个具有含义的值,因此将nil作为参数值明确告诉它为nil。这是有目的的,因此如果需要,您可以使用nil覆盖默认值。

如果您希望自己的参数在省略或nil时指定默认值,那么||=就是惯用的方法。

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

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

second = nil允许您省略参数,并指定默认值nil。如果参数为nil,您可以将其设置为实际默认值。这意味着传递nil并省略参数现在基本上是相同的。

它的行为方式并不普遍,因为有时你希望nil替换默认参数。默认参数的工作方式允许你这样做。