这个&符号是什么意思?

可能重复:
map(&:name)在Ruby中意味着什么?
你在Ruby中称为&:运算符是什么?

只是看一些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对象如下:

 some_method(&non_pr) 

然后, non_pr将通过to_proc隐式转换为Proc

例如,当non_prSymbol ,将应用Symbol#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的块的arity是1,这被简化为:

 each{|obj| obj.delete_all}