理解[ClassOne,ClassTwo] .each(&:my_method)

scu*_*bbl 12 ruby

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

我正在看一个railscast并看到了这段代码.

[Category, Product].(&:delete_all)
Run Code Online (Sandbox Code Playgroud)

关于清理数据库.

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

(&:delete_all)
Run Code Online (Sandbox Code Playgroud)

是一个捷径

{|model| model.delete_all}
Run Code Online (Sandbox Code Playgroud)

我用以下测试了这个

class ClassOne
  def class_method
    puts 1
  end
end

class ClassTwo
  def class_method
    puts 2
  end
end

[ClassOne, ClassTwo].each(&:class_method)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误说

Wrong Argument type Symbol (expected Proc)
Run Code Online (Sandbox Code Playgroud)

我也试过了

one = ClassOne.new
two = ClassTwo.new

[one, two].each(&:class_method)
Run Code Online (Sandbox Code Playgroud)

但那仍然失败了.

如果我修改它来阅读

[one, two].each{|model| model.class_method}
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作.

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

Ale*_*x M 20

这依赖于Ruby 1.9扩展,可以通过包含以下内容在1.8中完成:

class Symbol
    def to_proc
      proc { |obj, *args| obj.send(self, *args) }
    end
end
Run Code Online (Sandbox Code Playgroud)

我相信Rails定义了这个ActiveSupport.