【问题标题】:Skipping extra keyword arguments in Ruby在 Ruby 中跳过额外的关键字参数
【发布时间】:2015-09-05 16:08:06
【问题描述】:

我定义了一个方法:

def method(one: 1, two: 2)
   [one, two]
end

当我这样称呼它时:

method one: 'one', three: 'three'

我明白了:

ArgumentError: unknown keyword: three

我不想从哈希中一一提取所需的键或排除额外的键。除了定义这样的方法之外,有没有办法规避这种行为:

def method(one: 1, two: 2, **other)
  [one, two, other]
end

【问题讨论】:

  • 为什么不能像method(one: 1, two: 2, **other)那样做?
  • 这些**other参数好像是多余的
  • 是否要引用方法体中的其他参数?同时您不想在方法配置文件中引用它?如果是这样,那么您尝试做的事情没有意义。你怎么能引用一个特定的参数而不在方法定义中接收呢?
  • 其中一个原因是不关心参数的顺序,但这样做还有其他要求

标签: ruby ruby-2.0 keyword-argument


【解决方案1】:

不确定它是否适用于 ruby​​ 2.0,但您可以尝试使用 **_ 忽略其他参数。

def method(one: 1, two: 2, **_)

在内存使用和其他方面,我相信这和**other 没有区别,但下划线是在 ruby​​ 中静音参数的标准方法。

【讨论】:

  • 如果我想忽略除 :one 和 :two 之外的所有内容,我会这样做。
【解决方案2】:

解决此问题的常用方法是使用选项哈希。你会经常看到这个:

def method_name(opts={})
  one = opts[:one] || 1  # if caller doesn't send :one, provide a default
  two = opts[:two] || 2  # if caller doesn't send :two, provide a default

  # etc
end

【讨论】:

  • 是的,我知道,但我对使用关键字参数特别感兴趣,而不是关于选项的哈希
  • 啊,好的。那么在这种情况下,如果您想忽略其他人,我已经看到 **_ 作为最后双 splat 的建议名称。
【解决方案3】:

如果不想像**other那样写other,可以省略。

def method(one: 1, two: 2, **)
  [one, two]
end

【讨论】:

  • 我刚试过,在我当前项目中使用的 ruby​​ 2.0.0 下不起作用。因此我仍然得到同样的错误
  • 它确实适用于 Ruby 2.2。我认为它也应该适用于 Ruby 2.0。你的环境到底是什么?我希望您不要说您只在 IRB 上尝试过,无论 Ruby 版本如何,它都无法正常工作。
  • 我还没准备好回答。我会用不同的版本检查一下,然后告诉你,谢谢。
  • 如果您不顾一切指导并且像我一样倾向于声明不带括号的方法,这也不起作用。
  • 不错!喜欢它,我正在寻找这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 2016-12-01
  • 2020-03-25
  • 1970-01-01
  • 2017-08-08
  • 2014-01-09
  • 1970-01-01
相关资源
最近更新 更多