我有简单的功能
def fn(x,a:nil)
"#{x.inspect} - #{a.inspect}"
end
正在做puts fn({ 'v' => 1, :a => 2})
我按预期得到{"v"=>1, :a=>2} - nil
。
但如果我x
可选,就像def fn(x=nil,a:nil)
一样,我意外地获得{"v"=>1} - 2
,即a
部分已从哈希中移除并放入关键字参数。
为什么只有x
是可选的时才会发生这种情况?
(我知道调用等同于fn('v' => 1, :a => 2)
,并且使用它确实不会改变行为。)
debian ruby 2.1.5p273
,与RHEL ruby 2.0.0p598
相同。
答案 0 :(得分:0)
Ruby隐式地将哈希转换为关键字args,这是一个很好的帖子:https://makandracards.com/makandra/36013-heads-up-ruby-implicitly-converts-a-hash-to-keyword-arguments
因此,他们建议您不要混用关键字和可选参数:https://makandracards.com/makandra/36011-ruby-do-not-mix-optional-and-keyword-arguments