Ruby 2.0 double splat (**) 双星号的一些用法

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

要注意保持良好的代码 风 空格:

def f **x;end
h = {}
f **h # 双打散 :) 
f\
**h3 # 双打散 :) 
f** h # 阶乘 :( 
f ** h # 阶乘 :( 
f**h # 阶乘 :( 

规则就是:

  • 方法名后无空格紧接 **, 就是阶乘
  • 要 double splat 时, ** 后不能带空格
This entry was posted in ruby on rails. Bookmark the permalink.

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>