在Ruby中,你如何称呼&:运算符?

12 浏览
0 Comments

在Ruby中,你如何称呼&:运算符?

我在阅读Stackoverflow时偶然发现了下面的代码:

array.map(&:to_i)

嗯,很容易看出这段代码的作用,但我想了解更多关于我从未见过的&:结构。

不幸的是,我能想到的只有"lambda",但这不是lambda。谷歌告诉我Ruby中的lambda语法是->->(x,y){ x * y }

所以,有人知道那个神秘的&:是什么,它除了调用单个方法之外还能做什么吗?

0
0 Comments

在Ruby语言中,出现了一个名为Symbol#to_proc的转换。这是Ruby 1.9及以上版本的一部分,如果您使用较新版本的Rails,也可以使用它。

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

当您说foo.map(&bar)时,您告诉Ruby:“向foo对象发送一个消息,调用map方法,并使用我已经定义的名为bar的块”。如果bar不是已经是Proc对象,Ruby将尝试将其转换为Proc对象。

在这里,我们实际上并没有传递一个块,而是一个名为bar的符号。因为Symbol上有一个隐式的to_proc转换,Ruby会看到它并使用它。实际上,这个转换的代码如下:

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

这创建了一个调用与符号相同名称的方法的proc。将所有这些放在一起,使用您的原始示例:

array.map(&:to_i)

这会在数组上调用.map,并且对于数组中的每个元素,返回对该元素调用to_i的结果。

map(&:to_i)与map { |x| x.to_i }完全相同。由于map需要一个块,并且从Ruby 1.9开始,符号to_proc转换是隐式可用的。

0