配列、コレクション、またはActiveRecordクエリを扱うときに、&はどのようにレールに使用されますか?例とその仕組みを提供してください。どのように&レールで動作するのですか?
これまでのところ、一般的な配列の実装を見てきましたが、どのように動作するのか理解できません。以下は簡単な例です。答えを説明するためにこれを使用してください。
array = [1, 2, 3, 4]
array.each do |number|
number + 2
end
配列、コレクション、またはActiveRecordクエリを扱うときに、&はどのようにレールに使用されますか?例とその仕組みを提供してください。どのように&レールで動作するのですか?
これまでのところ、一般的な配列の実装を見てきましたが、どのように動作するのか理解できません。以下は簡単な例です。答えを説明するためにこれを使用してください。
array = [1, 2, 3, 4]
array.each do |number|
number + 2
end
Rubyはオブジェクトの前に&
に遭遇したとき、それは、このオブジェクトにto_proc
を呼ぶだろうので、それは、それはProc
ことを期待しています。
ですから、例えばあなたがオブジェクトにto_procを呼ぶだろうブロックを受け取るメソッドへの引数として&proc_object
を渡す
proc_object = proc{puts 1}
ていた場合。
&:method_name
への呼び出しは:method_name.to_proc.call
と同じですので、これはシンボル:proc_object
の場合と同じです。
列挙型では、オブジェクトはprocに渡されます。そのため、配列オブジェクトをループして各要素を印刷できるのは、これらの要素のそれぞれがループ中に生成されるためです。配列の各要素は、私のPROCに生じているため、コレクション内の各要素について
は、PROCこのような
[1,2,4,5].map(&:to_s) # => ['1', '2', '4', '5']
としてそれらに呼ばれるこれは、基本的に、文字列オブジェクトに配列の各要素を変換します。
あなたは&表示されるはずです。あなたがそれぞれに定義されていない方法で同じことを達成しようとしていた場合はこの方法はすでになどの要素のクラス内
が存在するため、要素のコンテキスト例えば5.to_s
内で実行to_sを要素の場合、undefined_methodエラーが発生します。
あなたの場合、私はadd_twoメソッドが存在しない限り、それが良い例ではないと思います。
{dave: :fogo, stack: :overflow, day: :today}.map(&:first) # => would return :dave, :stack, :day because for each loop through the map, an array is yielded with the first element being the key and the second the value.
[1,2,3,5,10].map(&:even?) # => [false, true, false, false, true]
配列とハッシュのActiveRecordのに似ていますが、知っている一つのことは、あなたが渡している方法は、要素のクラス内で定義されなければならないということです。
これは意味があると思います。
あなたの質問から、あなたが探しているのはどちらが使われているのか不明です。 '&'はArray(http://ruby-doc.org/core-2.2.0/Array.html#method-i-26)の集合交差演算子として実装されますが、Symbolの 'to_proc'の別名です(http://ruby-doc.org/core-2.0.0/Symbol.html#method-i-to_proc)、簡潔なコレクションイテレータを書くためによく使われます。 – Jonah