你在Ruby中称之为&:运算符是什么?

时间:2010-02-14 01:06:09

标签: ruby

  

可能重复:
  Ruby/Ruby on Rails ampersand colon shortcut
  What does map(&:name) mean in Ruby?

我正在阅读Stackoverflow并偶然发现以下代码

array.map(&:to_i)

好的,很容易看出这段代码的作用,但我想了解更多关于&:构造的内容,这是我以前从未见过的。

不幸的是,我能想到的只是“lambda”,而不是。 Google告诉我Ruby中的lambda语法是->->(x,y){ x * y }

所以任何人都知道神秘的&:是什么以及除了调用单一方法之外它能做什么?

1 个答案:

答案 0 :(得分:64)

这里有一些活动的部分,但正在进行的是Symbol#to_proc转换的名称。这是Ruby 1.9及更高版本的一部分,如果您使用Rails的后续版本,也可以使用它。

首先,在Ruby中,:foo表示“符号foo”,因此它实际上是您正在查看的两个独立运算符,而不是一个大&:运算符。

当你说foo.map(&bar)时,你告诉Ruby,“向foo对象发送一条消息来调用map方法,我已经定义了一个名为{{1的块}}”。如果bar不是bar对象,Ruby将尝试将其设为一个。

在这里,我们实际上并没有传递一个块,而是一个名为Proc符号。因为我们在bar上有一个隐式to_proc转换,所以Ruby会看到并使用它。事实证明,这种转换看起来像这样:

Symbol

这使得def to_proc proc { |obj, *args| obj.send(self, *args) } end 调用与符号同名的方法。将所有内容放在一起,使用您的原始示例:

proc

这将在数组上调用array.map(&:to_i) ,并且对于数组中的每个元素,返回在该元素上调用.map的结果。