关键字参数如何工作?

时间:2016-06-15 08:07:36

标签: ruby keyword-argument

我有一段示例代码:

def m(args = nil, **kwargv)
  puts kwargv
  a = args or {}
  puts a
  kwargv['a'] = a
  puts kwargv
end

当我调用时:

m(args = {'c':'d'})
m(args: {'c': 'd'})
m(args = {xxx}, {})

仅在最后一个args被解释为args;在第一个和第二个中,dict将用作kwargv

是否有更优雅的方式将args指定为词典?

1 个答案:

答案 0 :(得分:3)

这应该有效:

> m({'c' => 'd'})
# {}
# {"c"=>"d"}
# {"a"=>{"c"=>"d"}}
# => nil

这背后的逻辑是因为第一个参数是可选的(默认为nil),最后一个参数是关键字参数,传递带符号键(m({ :c => 'd'}))的哈希将是解释为关键字哈希。任何其他类型的参数将作为第一个参数传递。如果您确实需要将关键字哈希作为第一个参数传递,则还需要显式传递第二个参数:

> m({ :c => 'd' }, {})
# {}
# {:c=>"d"}
# {"a"=>{:c=>"d"}}

另一方面,在命名args参数(m(args=something))时调用方法是多余的,实际上做的事情与您想象的不同(将something分配给局部变量命名为args,然后将其传递给方法)。请改用m(something)