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

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

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

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What does map(&:name) mean in Ruby?

我正在看一个栏杆广播,看到了这段代码。

1
[Category, Product].(&:delete_all)

关于清除数据库。

我问了IRC中的电话,并被告知

1
(&:delete_all)

是捷径

1
{|model| model.delete_all}

我用以下方法测试了

1
2
3
4
5
6
7
8
9
10
11
12
13
class ClassOne
  def class_method
    puts 1
  end
end

class ClassTwo
  def class_method
    puts 2
  end
end

[ClassOne, ClassTwo].each(&:class_method)

我收到一条错误消息,说

1
Wrong Argument type Symbol (expected Proc)

我也试过

1
2
3
4
one = ClassOne.new
two = ClassTwo.new

[one, two].each(&:class_method)

但这仍然失败。

如果我将其修改为阅读

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

一切都按预期进行。

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


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

1
2
3
4
5
class Symbol
    def to_proc
      proc { |obj, *args| obj.send(self, *args) }
    end
end

我相信Rails在ActiveSupport中对此进行了定义。


这是Ruby的一些Rails特定补丁,即proc的符号。


推荐阅读