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

时间:2008-09-19 03:33:06

标签: ruby

  

可能重复:
  What does map(&:name) mean in Ruby?

我正在观看有轨电视播放并看到此代码。

[Category, Product].(&:delete_all)

关于清理数据库。

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

(&:delete_all)

的捷径
{|model| model.delete_all}

我用以下

测试了这个
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是一种方法,所以我对这里发生的事情感到困惑。

2 个答案:

答案 0 :(得分:20)

这取决于可以在1.8中完成的Ruby 1.9扩展,包括以下内容:

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

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

答案 1 :(得分:3)

这是Ruby的一些Rails特定补丁,symbol to proc