我有一段示例代码:
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
指定为词典?
答案 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)
。