4

可能重复:
map(&:name) 在 Ruby 中是什么意思?
你如何称呼 Ruby 中的 &: 运算符?

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

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

我知道它会删除这些模型的所有记录,但我不知道这&:delete_all意味着什么。

4

3 回答 3

7

它基本上是这个的简写:

[Category, Product, Person].each { |e| e.delete_all }

也就是说,它发送delete_all到迭代器的每个元素。

于 2012-11-14T16:37:20.953 回答
1

&:delete_all基本上转换为|obj| obj.delete_all。& 号在循环上的当前对象上调用 to_proc。

于 2012-11-14T16:40:55.280 回答
1

当您将Proc对象pr放在&最后一个参数位置时,例如:

some_method(&pr)

然后,对应的块pr将被传递给some_method. 如果给定non_pr一个不是 a 的对象,Proc例如:

some_method(&non_pr)

然后,non_pr将隐式转换为 a Procby to_proc

例如,when non_pris 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}
于 2012-11-14T17:18:27.677 回答