Ruby 这个符号是什么意思?

Ruby 这个符号是什么意思?,ruby,Ruby,可能重复: 只要看看railscast,就会看到这样的代码: [Category, Product, Person].each(&:delete_all) class Symbol def to_proc proc{|obj, *args| obj.send(self, *args)} end end each{|obj, *args| obj.delete_all(*args)} 我知道它会删除这些型号的所有记录,但我不知道这是什么意思。这基本上是这个的简写:

可能重复:

只要看看railscast,就会看到这样的代码:

[Category, Product, Person].each(&:delete_all)
class Symbol
  def to_proc
    proc{|obj, *args| obj.send(self, *args)}
  end
end
each{|obj, *args| obj.delete_all(*args)}

我知道它会删除这些型号的所有记录,但我不知道这是什么意思。

这基本上是这个的简写:

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

也就是说,它将
delete\u all
发送到迭代器的每个元素。

和:delete\u all基本上转换为|obj | obj.delete\u all。符号AND对循环中的当前对象调用_proc

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

some_method(&pr)
然后,与
pr
相对应的块将被传递给
some\u方法
。如果对象
non_pr
不是
Proc
如下所示:

some_method(&non_pr)
然后,
非\u pr
将通过
到\u Proc
隐式转换为
Proc

例如,当
non\u pr
Symbol
时,将应用
Symbol#to_proc
,这恰好是这样的:

[Category, Product, Person].each(&:delete_all)
class Symbol
  def to_proc
    proc{|obj, *args| obj.send(self, *args)}
  end
end
each{|obj, *args| obj.delete_all(*args)}
特别是对于
each(&:delete_all)
:delete_all.to_proc
将返回
proc
对象:

proc{|obj, *args| obj.delete_all(*args)}
因此,相应的块将按如下方式传递给每个:

[Category, Product, Person].each(&:delete_all)
class Symbol
  def to_proc
    proc{|obj, *args| obj.send(self, *args)}
  end
end
each{|obj, *args| obj.delete_all(*args)}
请注意,
Enumerable#每个
的块的arity是一,这被简化为:

each{|obj| obj.delete_all}

这是StackOverflow上至少20个其他问题的副本,这些问题已经在这里得到了提问和回答:、、、、、、、、、、、、、、、、、、、、、、。