你在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
的结果。