重複の可能性:
Ruby で map(&:name) とはどういう意味ですか?
Ruby で &: 演算子を何と呼びますか?
railscast を見ているだけで、次のようなコードが表示されます。
[Category, Product, Person].each(&:delete_all)
&:delete_all
これらのモデルのすべてのレコードが消去されることは知っていますが、これが何を意味するのかわかりません。
重複の可能性:
Ruby で map(&:name) とはどういう意味ですか?
Ruby で &: 演算子を何と呼びますか?
railscast を見ているだけで、次のようなコードが表示されます。
[Category, Product, Person].each(&:delete_all)
&:delete_all
これらのモデルのすべてのレコードが消去されることは知っていますが、これが何を意味するのかわかりません。
これは基本的にこれの省略形です:
[Category, Product, Person].each { |e| e.delete_all }
つまりdelete_all
、イテレータの各要素に送信します。
次のように、最後の引数の位置にProc
オブジェクトpr
を配置する場合:&
some_method(&pr)
次に、 に対応するブロックpr
が に渡されsome_method
ます。non_pr
ではないオブジェクトが次のProc
ように与えられた場合:
some_method(&non_pr)
次に、non_pr
暗黙的に by に変換さProc
れto_proc
ます。
たとえば、 whennon_pr
が 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
が 1 であることに注意すると、次のように単純化されます。
each{|obj| obj.delete_all}
&:delete_allは基本的に|obj|に変換されます。obj.delete_all。アンパサンドは、ループ上の現在のオブジェクトで to_proc を呼び出します。