Ruby & &冒号快捷方式

< p > 可能的重复: < br > map(&:name)在Ruby中是什么意思? < / p >

在Ruby中,我知道如果我这样做:

some_objects.each(&:foo)

这和

some_objects.each { |obj| obj.foo }

也就是说,&:foo创建块{ |obj| obj.foo },将其转换为Proc,并将其传递给每个Proc。为什么会这样?这只是Ruby的特殊情况,还是有原因为什么这样工作?

102211 次浏览

可以说,你的问题是错的。这里发生的不是“&”和“冒号”,而是“&”和“对象”。在这种情况下,冒号是符号。有&:foo

&调用对象上的to_proc,并将其作为块传递给方法。在Ruby中,to_proc是在Symbol上实现的,因此这两个调用是等价的:

something {|i| i.foo }
something(&:foo)

所以,总结一下:&在对象上调用to_proc,并将其作为块传递给方法,Ruby在Symbol上实现to_proc

符号和符号的组合并没有什么特别之处。下面是(ab)使用正则表达式的例子:

class Regexp
def to_proc
->(str) { self =~ str ; $1 }
end
end
%w(station nation information).map &/(.*)ion/


=> ["stat", "nat", "informat"]

或整数。

class Integer
def to_proc
->(arr) { arr[self] }
end
end


arr = [[*3..7],[*14..27],[*?a..?z]]
arr.map &4
=> [7, 18, "e"]

当你有arr.map &4时,谁还需要arr.map(&:fifth) ?