只是看一些 railscast 并看到这样的代码:
[Category, Product, Person].each(&:delete_all)
我知道它会删除这些模型的所有记录,但我不知道这&:delete_all意味着什么。
只是看一些 railscast 并看到这样的代码:
[Category, Product, Person].each(&:delete_all)
我知道它会删除这些模型的所有记录,但我不知道这&:delete_all意味着什么。
它基本上是这个的简写:
[Category, Product, Person].each { |e| e.delete_all }
也就是说,它发送delete_all到迭代器的每个元素。
&:delete_all基本上转换为|obj| obj.delete_all。& 号在循环上的当前对象上调用 to_proc。
当您将Proc对象pr放在&最后一个参数位置时,例如:
some_method(&pr)
然后,对应的块pr将被传递给some_method. 如果给定non_pr一个不是 a 的对象,Proc例如:
some_method(&non_pr)
然后,non_pr将隐式转换为 a Procby to_proc。
例如,when non_pris a Symbol, thenSymbol#to_proc将被应用,它恰好是这样的:
class Symbol
def to_proc
proc{|obj, *args| obj.send(self, *args)}
end
end
特别是each(&:delete_all),:delete_all.to_proc将返回Proc对象:
proc{|obj, *args| obj.delete_all(*args)}
所以相应的块将被传递给each这样的:
each{|obj, *args| obj.delete_all(*args)}
注意到一个块的元数Enumerable#each是一,这被简化为:
each{|obj| obj.delete_all}