只是看一些 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 Proc
by to_proc
。
例如,when non_pr
is 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}