double splat 除了可以在方法定义中简化 opts 外,还可以用来组装 hash, 以后可以少写几个 merge
了:
h1 = {a: 1}
h2 = {b: 2}
h3 = {**h1, c: 3, **h2} #=> {:a=>1, :c=>3, :b=>2}
后放入的项会覆盖前面的项
h3 = {**h3, a: 'rewritten'} #=> {:a=>'rewritten', :c=>3, :b=>2}
任何实现了 to_ary
方法的对象都可以用 splat, 任何实现了 to_hash
方法的对象都可以 double splat:
class S < Struct.new :a, :b
alias to_hash to_h
end
s = S.new 1, 2 #=> #<struct S a=1, b=2>
{**s} #=> {:a=>1, :b=>2}
特殊情况:如果生成只包含 1 个 hash 的数组,用 double splat 可以省一个大括号...
[**s, :a=>3]
这个暂时还不能用于 mass assignment
P.S. 要注意保持良好的代码 风 空格:
def f **x;end
h = {}
f **h # 双打散 :)
f\
**h3 # 双打散 :)
f** h # 阶乘 :(
f ** h # 阶乘 :(
f**h # 阶乘 :(
规则就是:
**
, 就是阶乘**
后不能带空格