理解 .each(&:my_method)

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

我正在看railscast,看到这个代码。

[Category, Product].(&:delete_all) 

关于清理数据库。

我询问了IRC的线路,并被告知

 (&:delete_all) 

是一个捷径

 {|model| model.delete_all} 

我testing了以下内容

 class ClassOne def class_method puts 1 end end class ClassTwo def class_method puts 2 end end [ClassOne, ClassTwo].each(&:class_method) 

我收到一个错误说

 Wrong Argument type Symbol (expected Proc) 

我也试过了

 one = ClassOne.new two = ClassTwo.new [one, two].each(&:class_method) 

但是那仍然失败了。

如果我修改它来阅读

 [one, two].each{|model| model.class_method} 

一切按预期工作。

那么, &:delete_all实际上是做什么的? 文档说delete_all是一种方法,所以我对这里发生的事情感到困惑。

这依赖于1.8版本的Ruby 1.9扩展,其中包括以下内容:

 class Symbol def to_proc proc { |obj, *args| obj.send(self, *args) } end end 

我相信Rails在ActiveSupport定义了这个。

这是一些Rails特定的Ruby修补程序, 符号到proc 。