这个&符号是什么意思?

时间:2012-11-14 16:35:42

标签: ruby

  

可能重复:
  What does map(&:name) mean in Ruby?
  What do you call the &: operator in Ruby?

只是观看一些railscast并看到这样的代码:

[Category, Product, Person].each(&:delete_all)

我知道它会删除这些模型的所有记录,但我找不到这个&:delete_all的含义。

3 个答案:

答案 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_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}