Ruby&符号冒号快捷键

可能重复:
在Ruby中map(&:name)是什么意思?

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

some_objects.each(&:foo) 

这是一样的

 some_objects.each { |obj| obj.foo } 

也就是说, &:foo创build块{ |obj| obj.foo } { |obj| obj.foo } ,把它变成一个Proc,并传递给每个。 为什么这个工作? 这只是一个Ruby的特例,还是有原因为什么这样工作?

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

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

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

另外,在Ruby 1.8.7和1.9中实现了Symbol to_proc ,所以它实际上是一个“ruby的东西”。

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

&符号和符号的组合没有什么特别之处。 下面是一个例子,(ab)使用正则expression式:

 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) arr.map &4