我有一个这样定义的方法:
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/