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)
,使用它确实不会改变行为。)
debianruby 2.1.5p273
,与RHELruby 2.0.0p598
ruby隐式地将哈希转换为关键字args,下面是一篇好文章:
因此,他们建议您不要混合关键字和可选参数:这有点模糊,我不确定要说什么,但它肯定知道。我认为,x
在这里真的是咄咄逼人,先抓住一切可能的东西。在第二种情况下,x
得到剩余部分。可能与或其相关的问题有关。不幸的是,Ruby没有区分fn({a:2})
和fn(**{a:2})
,因此当一个方法同时使用位置参数和关键字参数时,会有很多歧义。