2011-12-05 8 views
1
myitem.inject({}) {|a,b| a[b.one] = b.two; a} 

を理解&実装持つ:苦労いくつかのRubyのコード

MYITEMが配列またはペアのオブジェクトを保持するクラスです(ペアオブジェクトは2つのそれらのフィールド1と2を持っている)

をI上記のコードが何をすべきかわからないのですか?

答えて

1

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

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

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

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

注入の結果を保存せずに、それはちょっと役に立たないです。

+0

実際の注射はどのように見えますか?実際の方法は私が –

+0

[ソースを使う](http://www.ruby-doc.org/core-1.9.3/Enumerable.html#method-i-inject)です。 –

+0

それぞれはうまくいきませんか? –

1

それは

h = {} 
myitem.each { |b| h[b.one] = b.two } 

またはそれが; aを必要として(私はpersonnalyこのパターンを嫌い(とそれを使う人)

a = {} 
mytem.each { |b| a[b.one] = b.two } 

あなたの元のコードに近くなるようにするの執筆知識をひけらかすの方法です最後に、注射のすべての機能的側面を失ってしまいます(「機能的パターン」内の副作用関数を使用し、その後の関数([..])が期待するオブジェクトを返さないことを認識することは間違っています、IMO)

を注入は、ここに

[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 

等...

+0

注射は何をするのですか?私は本当に理解していない –

+0

私はhの代わりに使用する必要があります。私は私の答えを編集します – mb14

+0

それが使用されている理由は連鎖のためです。それぞれはハッシュを返しません。 –

0
Hash[my_item.map {|object| [object.one, object.two]}] 

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

関連する問題