ruby关键字参数解构

时间:2018-01-16 16:37:01

标签: ruby language-lawyer destructuring keyword-argument

我有简单的功能

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相同。

1 个答案:

答案 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