ruby - 这个 Ruby 方法调用可以在末尾没有 **{} 的情况下进行吗?

标签 ruby argument-passing

我有一个这样定义的方法:

def woot(a = nil, b: nil)
  ...
end

当省略 b 时,将 Hash 实例传递给 a 的最不丑陋的方法是什么?

我试过了

woot(x: 1)
woot({x: 1})
h = {x: 1}
woot(h)

但他们都提高了

ArgumentError: unknown keyword: x

我想出的唯一方法是

woot({x: 1}, **{})

还有更好的方法吗?

最佳答案

您的第一个参数是可选的,因此 Ruby 假定您传递的哈希是针对命名参数 (*) 的。

我认为没有更好的解决方法,尽管它更短一些(但不一定更干净):

woot({x: 1}, {})

如果我是你,我会更改方法签名以解决歧义。


(*):好吧,并非总是如此:woot({1=>3}) 会愉快地将哈希值传递给第一个可选参数。

更奇怪的是,在 woot({1=> 5, :b => 4}) 的情况下,Ruby 将拆分字典,并传递 {1=>5} 到第一个可选参数。

看起来它首先尝试获取命名参数(并且会提示不存在的名称),然后将其余的传递给可选参数。

但我希望看到一些语言律师的解释...

关于ruby - 这个 Ruby 方法调用可以在末尾没有 **{} 的情况下进行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28007432/

相关文章:

arrays - 如何将包含数字+字符的字符串中的数字提取到 Ruby 中的数组中?

ruby - 如何使用 XPath 和 Nokogiri 获取 XML 节点的内容

c++ - 为 STL 容器使用没有默认构造函数的仿函数

macros - 在宏中,我可以让 ,var 评估为空白/无吗?

python - 在参数列表上线程化

c++ - 控制 DLL 中代码的可能方法

ruby-on-rails - 使用全名搜索时,Gem Ransack 不会返回任何结果

ruby-on-rails - Twitter API- Rails 未定义方法 `name' 为 nil :NilClass

python - 厌倦了 ASP.NET,我应该学习以下哪些内容,为什么?

ant - 将可选路径参数传递给 ant