4

重複の可能性:
Ruby で map(&:name) とはどういう意味ですか?
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

次のように、最後の引数の位置にProcオブジェクトprを配置する場合:&

some_method(&pr)

次に、 に対応するブロックprが に渡されsome_methodます。non_prではないオブジェクトが次のProcように与えられた場合:

some_method(&non_pr)

次に、non_pr暗黙的に by に変換さProcto_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}
于 2012-11-14T17:18:27.677 に答える
1

&:delete_allは基本的に|obj|に変換されます。obj.delete_all。アンパサンドは、ループ上の現在のオブジェクトで to_proc を呼び出します。

于 2012-11-14T16:40:55.280 に答える