12

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

我正在观看 railscast 并看到了这段代码。

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

4

2 回答 2

20

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

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

我相信 Rails 在ActiveSupport.

于 2008-09-19T03:36:00.820 回答
3

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

于 2008-09-19T03:36:54.250 回答