我看到了默认参数的特定代码味道。也就是说,当一个方法为其中一个参数设置了默认值但调用者传递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,就指定一个默认值。
答案 0 :(得分:8)
def bar(first, second = 2)
如果省略参数,则将second
设置为2
。 nil
是一个具有含义的值,因此将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
替换默认参数。默认参数的工作方式允许你这样做。