2016-10-27 9 views
-1

Rubyでは、というオブジェクトのリストがあり、Idのプロパティとvalueというプロパティがあります。オブジェクトのリストをハッシュに変換する

Idをキーとし、対応するキーの値をValueとするハッシュを作成したいとします。

私が試した:thingsThing

のリストである。しかし、これは動作しませんでした

result = Hash[things.map { |t| t.id, t.value }] 

を。前2.0 Rubyのバージョンの

+0

result = things.each_with_object({}){| t, h | h[t.id] = t.value} 
@potashin、Iは「リスト」は、配列を意味信じます。 –

+0

「うまくいかない」ってどういう意味ですか?それは間違った結果を返しましたか?例外が発生しましたか?後者の場合、例外は何ですか?あなたのコードに間違いはありません。 –

答えて

0
result = things.map{|t| {t.id => t.value } } 

中括弧の外側のペアの内容がブロックされ、内側のペアがハッシュを形成します。 しかし、これは動作することができる(ケアリーSwovelandによって示唆されるように)1つのハッシュが所望の結果である場合:

1
class Thing 
    attr_reader :id, :value 
    def initialize(id, value) 
    @id = id 
    @value = value 
    end 
end 

cat = Thing.new("cat", 9) 
    #=> #<Thing:0x007fb86411ad90 @id="cat", @value=9> 
dog = Thing.new("dog",1) 
    #=> #<Thing:0x007fb8650e49b0 @id="dog", @value=1> 

instances =[cat, dog] 
    #=> [#<Thing:0x007fb86411ad90 @id="cat", @value=9>, 
    # #<Thing:0x007fb8650e49b0 @id="dog", @value=1>] 

instances.map { |i| [i.id, i.value] }.to_h 
    #=> {"cat"=>9, "dog"=>1} 

または、:

Hash[instances.map { |i| [i.id, i.value] }] 
    #=> {"cat"=>9, "dog"=>1} 
関連する問題