在 Ruby 中,我知道如果我这样做:
some_objects.each(&:foo)
这是一样的
some_objects.each { |obj| obj.foo }
也就是说,&:foo创建 block { |obj| obj.foo },将其转换为 Proc,并将其传递给每个。为什么这行得通?它只是一个 Ruby 的特例,还是有理由这样工作?
&:foo
{ |obj| obj.foo }
你的问题是错误的,可以这么说。这里发生的不是“& 和冒号”,而是“& 和对象”。在这种情况下,冒号用于符号。所以,有&,有:foo。
&
:foo
对对象的&调用to_proc,并将其作为块传递给方法。在 Ruby 中,to_proc是在 上实现的Symbol,因此这两个调用是等价的:
to_proc
Symbol
something {|i| i.foo } something(&:foo)
因此,总结一下:&调用to_proc对象并将其作为块传递给方法,Ruby 实现to_procon Symbol.