ruby关键字参数解构

ruby关键字参数解构,ruby,language-lawyer,destructuring,keyword-argument,Ruby,Language Lawyer,Destructuring,Keyword Argument,我有一个简单的函数 def fn(x,a:nil) "#{x.inspect} - #{a.inspect}" end 执行操作会使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),使用它确实不会改

我有一个简单的函数

def fn(x,a:nil)
  "#{x.inspect} - #{a.inspect}"
end
执行
操作会使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

ruby隐式地将哈希转换为关键字args,下面是一篇好文章:


因此,他们建议您不要混合关键字和可选参数:

这有点模糊,我不确定要说什么,但它肯定知道。我认为,
x
在这里真的是咄咄逼人,先抓住一切可能的东西。在第二种情况下,
x
得到剩余部分。可能与或其相关的问题有关。不幸的是,Ruby没有区分
fn({a:2})
fn(**{a:2})
,因此当一个方法同时使用位置参数和关键字参数时,会有很多歧义。