【问题标题】:Passing absent parameters传递不存在的参数
【发布时间】:2013-08-10 00:03:03
【问题描述】:

我已经看到带有默认参数的特殊代码异味。那是当一个方法为其参数之一设置了默认值但调用者传递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 或没有传递参数时,分配一个默认值。

【问题讨论】:

    标签: ruby


    【解决方案1】:
    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。默认参数的工作方式允许您这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多