了解 [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) [重复]的主要内容,如果未能解决你的问题,请参考以下文章