4

我已经看到带有默认参数的特殊代码气味。那是当一个方法为其参数之一设置了默认值但调用者通过nil而不是不传递任何值。在大多数情况下,这是因为调用者有一个散列并且它试图从散列中传递一个特定的值。具体来说:

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

def bar(first, second = 2)
end

第二个参数 tofoo不会成为默认值,而是变成nil. 我见过的最常见的处理方式是功能栏中的第一行是:

second ||= 2 

有没有更好的方法来处理这个?也就是说,无论何时nil或没有参数被传递,分配一个默认值。

4

1 回答 1

9
def bar(first, second = 2)

如果参数省略,则设置second为。是一个具有含义的值,因此作为参数的值传递是明确告诉它是. 这是故意的,因此您可以根据需要覆盖默认值。2nilnilnilnil

如果您希望您的参数在省略或的情况下分配默认值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. 默认参数的工作方式允许您这样做。

于 2013-08-10T00:27:35.490 回答