我看到了默认参数的特定代码气味.也就是说,当一个方法为其中一个参数设置了默认值但调用者通过nil
而不是传递任何值时.在大多数情况下,这是因为调用者有一个哈希值,它试图从哈希值中传递一个特定的值.特别:
def foo(params)
...
bar(params[:first], params[:second]) # :second doesn't exist
end
def bar(first, second = 2)
end
Run Code Online (Sandbox Code Playgroud)
第二个参数foo
不会成为默认值而是变为nil
.我看到这种处理的最常见方式是功能栏中的第一行是:
second ||= 2
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个?也就是说,无论何时nil
传递或不传递参数,都要指定一个默认值.
def bar(first, second = 2)
Run Code Online (Sandbox Code Playgroud)
如果省略了参数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
Run Code Online (Sandbox Code Playgroud)
在second = nil
允许省略该参数,并且指定一个默认nil
.如果参数是nil
你可以将其设置为真正的默认值.这意味着传入nil
和省略参数现在基本上是相同的.
它不会以这种方式普遍存在,因为有时你想要用它替换默认参数nil
.默认参数的工作方式允许您这样做.