myitem.inject({}) {|a,b| a[b.one] = b.two; a}
どこ:
myitem は、配列またはペア オブジェクトを保持するクラスです (ペア オブジェクトには 1 つと 2 つの 2 つのフィールドがあります)。
上記のコードが何をすべきかわかりませんか?
空のマップから始めて、b.one キーの値を b.two に設定します。
つまり、「myitem」コレクション内のすべてのアイテムに対して、マップ エントリを作成します。キーはアイテムの「1」の値になります。そのマップ エントリの値は、アイテムの「2」の値になります。
「注入」に指定されたブロックは、2 つのパラメーターを受け取ります。1つ目は「アキュムレーター」です。この場合の初期値は、「注入」に渡される空のマップです。2 番目のパラメーターは、コレクション内の現在のアイテムです。この場合、コレクション内の各アイテム。
ブロックは、次のアキュムレータ値 (この場合はマップ) として使用されるものを返す必要があります。同じマップを使い続けたいので、完了したら、"inject" メソッドはすべてのキーと値のペアを含むマップを返します。
注入の結果を保存しないと、少し価値がありません。
衒学的な書き方だ
h = {}
myitem.each { |b| h[b.one] = b.two }
または元のコードに近づけるために
a = {}
mytem.each { |b| a[b.one] = b.two }
(私は個人的に、このパターン (およびそれを使用する人々) が; a
最後に を必要とし、inject のすべての機能的側面を失うので嫌いです。 (a[..]) 期待するオブジェクトが返されないのは間違っています、IMO)。
Inject は、リストを次のような結果に「折りたたむ」ための通常の使用法です。
[1,2,3].inject(0) { |sum, x| sum+x }
=> 6 # (0+1+2+3)
sum
はブロックの最後の呼び出しの結果で、x
はリストの各値で、0
は の初期値ですsum
。
[2,3].inject(10) { |p,x| p*x }
=> 60 # 10*2*3
など...
Hash[my_item.map {|object| [object.one, object.two]}]
それを行う別の方法です。