这个&符号是什么意思?
可能重复:
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_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}