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个其他问题的副本,这些问题已经在这里得到了提问和回答:、、、、、、、、、、、、、、、、、、、、、、。