在Ruby中,你如何称呼&:运算符?
在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转换是隐式可用的。