Ruby 坑: 关于两个星号捕获参数的使用 **hash

gihnius · 2017年01月06日 · 最后由 mizuhashi 回复于 2017年01月06日 · 1992 次阅读

代码:

[1] pry(main)> h = { a: 1, b: 2 }
=> {:a=>1, :b=>2}
[2] pry(main)> hh = { **h, c: 3 }
=> {:a=>1, :b=>2, :c=>3}
[3] pry(main)> hhh = { "a" => 1, "b" => 2 }
=> {"a"=>1, "b"=>2}
[4] pry(main)> hhhh = { **hhh, "c" => 3 }
TypeError: wrong argument type String (expected Symbol)
from (pry):4:in `__pry__'
[5] pry(main)>

ruby 2.x 增加了 keyword arguments, 而 **hash 也只是针对 keyword arguments 的。

http://stackoverflow.com/questions/25191747/why-does-double-splat-only-work-with-symbol-keys

按需取用吧,**的好处是以下情况可以正确捕获

def t a = 1, b, **c
  p a,b,c
end

def t2 a = 1, *b, **c
  p a,b,c
end

t 1, a: 1      #=> 1   1            {:a=>1}
t 1, 'a' => 1  #=> 1   {"a"=>1}     {}

t2 1, a: 1     #=> 1   []           {:a=>1}
t2 1, 'a' => 1 #=> 1   [{"a"=>1}]   {}

行为各异,能用就好

需要 登录 后方可回复, 如果你还没有账号请 注册新账号