可能重复:
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 }
所以任何人都知道神秘的&:
是什么以及除了调用单一方法之外它能做什么?
答案 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
的结果。