Ruby一元运算符`&`仅对方法参数有效

时间:2016-06-30 18:15:16

标签: ruby

你可能知道,Ruby有一个简写操作符&,让我们可以轻松地将Symbol转换为Proc。例如:

%w(a b c).map(&:upcase) #=> ["A", "B", "C"]

相当于:

%w(a b c).map { |c| c.upcase } #=> ["A", "B", "C"]

并且解释是&:upcaseto_proc上调用:upcase来创建Proc对象。

所以,这几乎解释了当运算符用作方法的最后一个参数时运算符的作用。

但是,看起来不可能在方法调用的参数之外的任何地方使用运算符:

:upcase.to_proc  => #<Proc:0x007febbc85ab38(&:upcase)>
&:upcase         => SyntaxError: syntax error, unexpected &

这样使用会很好:

case number
when &:even?
  # ...
when &:prime?
  # ...
end

但这有效:

case number
when :even?.to_proc
  # ...
when :prime?.to_proc
  # ...
end

简而言之,一元运算符&只能用于方法的参数,例如arr.map(&:upcase)。这是什么原因?

1 个答案:

答案 0 :(得分:8)

&一元前缀&符号运算符&#34;解包&#34;一个Proc(或一个可以通过发送Proc消息将其转换为to_proc的对象)到一个块中,传递它就好像它已作为一个块传递一样。只有消息发送可以有块参数,只有&一元前缀符号运算符才允许参数列表中的最后一个参数发送给消息。

同样,&#34;对话&#34;一元前缀&符号运算符&#34;包&#34;一个块到Proc,因此只允许块或方法定义的参数列表中的最后一个参数。