传递缺席参数

Her*_*arn 4 ruby

我看到了默认参数的特定代码气味.也就是说,当一个方法为其中一个参数设置了默认值但调用者通过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传递或不传递参数,都要指定一个默认值.

Ale*_*yne 8

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.默认参数的工作方式允许您这样做.