可能重复:
What does map(&:name) mean in Ruby?
What do you call the &: operator in Ruby?
只是观看一些railscast并看到这样的代码:
[Category, Product, Person].each(&:delete_all)
我知道它会删除这些模型的所有记录,但我找不到这个&:delete_all
的含义。
答案 0 :(得分:7)
这基本上是简写:
[Category, Product, Person].each { |e| e.delete_all }
也就是说,它将delete_all
发送给迭代器的每个元素。
答案 1 :(得分:1)
&:delete_all 基本上转换为 | obj | obj.delete_all 即可。 &符号在循环上调用当前对象上的to_proc。
答案 2 :(得分:1)
当您将Proc
对象pr
与&
放在最后一个参数位置时,例如:
some_method(&pr)
然后,与pr
对应的块将传递给some_method
。如果对象non_pr
不是Proc
,则给出如下:
some_method(&non_pr)
然后,non_pr
将被Proc
隐式转换为to_proc
。
例如,当non_pr
为Symbol
时,则会应用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}