【问题标题】:Are these two Ruby methods with a hash parameter equivalent? If not, why not?这两个带有哈希参数的 Ruby 方法是否等效?如果不是,为什么不呢?
【发布时间】:2013-05-14 14:16:24
【问题描述】:

方法的第一个版本:

def method(param1, param2={})
  meth_x(param2).meth_y(param1)
  meth_z
  #...
end

方法的第二个版本(注意第二个参数2)...

def method(param1, param2={})
  meth_x(param2={}).meth_y(param1)
  meth_z
  #...
end

我会假设这两种方法是等价的,因此我会选择第一种(更少的打字,更少的冗余)。

但是,我很好奇这些行为是否会有所不同,如果是,为什么。

【问题讨论】:

  • 您认为它们的行为可能不同有什么原因?
  • 我从团队中的其他开发人员那里得到了关于行为差异的模糊声明——尽管目前我对他们持怀疑态度。 :-)

标签: ruby


【解决方案1】:

在第二个中,您将param2 设置为空哈希,然后将其作为参数提供给meth_x。在方法定义中param2 = {} 表示如果省略参数,则将其设置为此默认的空哈希,但在meth_x(param2 = {}) 中表示您删除 param2 的原始内容并将其替换为空哈希,然后给meth_x

irb(main):001:0> a = {:alma => 2}
=> {:alma=>2}
irb(main):002:0> puts a
{:alma=>2}
=> nil
irb(main):003:0> puts(a)
{:alma=>2}
=> nil
irb(main):004:0> puts(a = {})
{}
=> nil

【讨论】:

  • 那么在第二种情况下,param2 将 总是 是一个空哈希吗?
  • 我的意思是,实际上无论传递给#method的是什么,它总是一个空哈希?
  • 是的,就是这样。更好的是,对于其余的 method param2 将包含这个新值。如果您打算将其初始化为空哈希以防它为nil,则使用meth_x(param2 ||= {})meth_x(param2 || {})。这样原始内容就不会丢失。但是由于您在方法定义中使用了默认参数值,因此不能这样。
猜你喜欢
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-19
  • 2014-12-22
  • 2011-06-04
相关资源
最近更新 更多