1
myitem.inject({}) {|a,b| a[b.one] = b.two; a}

どこ:

myitem は、配列またはペア オブジェクトを保持するクラスです (ペア オブジェクトには 1 つと 2 つの 2 つのフィールドがあります)。

上記のコードが何をすべきかわかりませんか?

4

3 に答える 3

1

空のマップから始めて、b.one キーの値を b.two に設定します。

つまり、「myitem」コレクション内のすべてのアイテムに対して、マップ エントリを作成します。キーはアイテムの「1」の値になります。そのマップ エントリの値は、アイテムの「2」の値になります。

「注入」に指定されたブロックは、2 つのパラメーターを受け取ります。1つ目は「アキュムレーター」です。この場合の初期値は、「注入」に渡される空のマップです。2 番目のパラメーターは、コレクション内の現在のアイテムです。この場合、コレクション内の各アイテム。

ブロックは、次のアキュムレータ値 (この場合はマップ) として使用されるものを返す必要があります。同じマップを使い続けたいので、完了したら、"inject" メソッドはすべてのキーと値のペアを含むマップを返します。

注入の結果を保存しないと、少し価値がありません。

于 2011-12-05T15:46:51.140 に答える
1

衒学的な書き方だ

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

など...

于 2011-12-05T15:48:38.247 に答える
0
Hash[my_item.map {|object| [object.one, object.two]}]

それを行う別の方法です。

于 2011-12-05T22:34:01.693 に答える