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

Posted

技术标签:

【中文标题】了解 [ClassOne, ClassTwo].each(&:my_method) [重复]【英文标题】:Understanding [ClassOne, ClassTwo].each(&:my_method) [duplicate] 【发布时间】:2010-09-11 02:08:50 【问题描述】:

可能重复:What does map(&:name) mean in 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 是一种方法,所以我对这里发生的事情感到困惑。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这是正确的;如果你在 irb 中运行你的测试,它不会工作(假设你运行的是 Ruby 1.8.x)。在脚本/控制台中再试一次。【参考方案2】:

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

【讨论】:

这个答案曾经是正确的,但 Ruby 1.8.6 及更早版本现在是真正的遗产。

以上是关于了解 [ClassOne, ClassTwo].each(&:my_method) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 聚合有两个模型

UIView和UIViewController有什么区别?

mypy:如何最好地处理 random.choice

PHP通过_call实现多继承

按字符串名称的 C++ 通用对象工厂

转职成为TypeScript程序员的参考手册