你在Ruby中调用&:运算符是什么?

可能重复:
Ruby / Ruby on Rails&符号冒号捷径
在Ruby中map(&:name)是什么意思?

我正在阅读Stackoverflow和偶然发现下面的代码

array.map(&:to_i) 

好吧,很容易看到这段代码做了什么,但是我想知道更多关于&:构造,这是我从未见过的。

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

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

这里有几个移动的部分,但是发生什么的名字是Symbol#to_proc转换。 这是Ruby 1.9及更高版本的一部分,如果您使用后期版本的Rails,也是可用的。

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

当你说foo.map(&bar) ,你告诉Ruby,“发送一个消息到foo对象来调用map方法,我已经定义了一个叫做bar的块”。 如果bar不是Proc对象,那么Ruby将会尝试使之成为一个。

在这里,我们实际上并没有通过一个块,而是一个名为bar符号 。 因为我们在Symbol上有一个隐式的to_proc转换,Ruby可以看到并使用它。 事实certificate,这种转换看起来像这样:

 def to_proc proc { |obj, *args| obj.send(self, *args) } end 

这使得调用与该符号同名的方法的过程。 把它放在一起,用你最初的例子:

 array.map(&:to_i) 

这将在数​​组上调用.map ,并为数组中的每个元素返回在该元素上调用to_i的结果。