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

vav*_*ava 34 ruby

可能的重复:
Ruby/Ruby on Rails&符号冒号快捷方式
map(&:name)在Ruby中意味着什么?

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

array.map(&:to_i)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Joh*_*lla 64

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

首先,在Ruby中,:foo意思是"符号foo",所以它实际上是你正在看的两个独立的运算符,而不是一个大&:运算符.

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

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

def to_proc
  proc { |obj, *args| obj.send(self, *args) }
end
Run Code Online (Sandbox Code Playgroud)

这使得a proc调用与符号同名的方法.将所有内容放在一起,使用您的原始示例:

array.map(&:to_i)
Run Code Online (Sandbox Code Playgroud)

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

  • map(&:to_i)与map {| x |完全相同 x.to_i}.由于map需要块并且从ruby 1.9开始,因此可以隐式使用Symbol to_proc转换. (9认同)