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

xuu*_*uso 3 ruby

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

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

相当于:

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

而解释是,&:upcase呼吁to_proc:upcase创建一个Proc对象.

因此,这几乎解释了当运算符用作方法的最后一个参数时操作符的作用.

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

:upcase.to_proc  => #<Proc:0x007febbc85ab38(&:upcase)>
&:upcase         => SyntaxError: syntax error, unexpected &
Run Code Online (Sandbox Code Playgroud)

这样用得很好:

case number
when &:even?
  # ...
when &:prime?
  # ...
end
Run Code Online (Sandbox Code Playgroud)

这有效:

case number
when :even?.to_proc
  # ...
when :prime?.to_proc
  # ...
end
Run Code Online (Sandbox Code Playgroud)

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

Jör*_*tag 8

所述&一元前缀符号运算符"解包"一个Proc(即可以被转换为一个或一个对象Proc通过发送它的to_proc成块,将它作为如果它作为一个块被传递消息).只有消息发送可以有块参数,ergo &一元前缀和号运算符只允许参数列表中的最后一个参数发送给消息.

同样,"双"一元前缀&符号运算符将块"打包"到a中Proc,因此仅允许块或方法定义的参数列表中的最后一个参数.