2012-02-10 8 views
7

Jak mogę dodać wartość w obiekcie Hash za pomocą klucza, który ma już wartość. Tak na przykład jeśli mamDołącz wartość do obiektu mieszania (w Ruby), używając już istniejącego klucza?

>> my_hash = Hash.new 
>> my_hash[:my_key] = "Value1" 
# then append a value, lets say "Value2" to my hash, using that same key "my_key" 
# so that it can be 
>> my_hash[:my_key] 
=> ["Value1", "Value2"] 

znam jej łatwo napisać własny sposób, ale ja po prostu chciałem wiedzieć, czy jest wbudowany w metodzie.

Odpowiedz

9

Nie wiem, czy jestem brakuje swój punkt, ale masz zważył, co następuje:

1.9.3 (main):0 > h={} 
=> {} 
1.9.3 (main):0 > h[:key] = [] 
=> [] 
1.9.3 (main):0 > h[:key] << "value1" 
=> ["value1"] 
1.9.3 (main):0 > h[:key] << "value2" 
=> ["value1", "value2"] 
1.9.3 (main):0 > h[:key] 
=> ["value1", "value2"] 
+0

oh ok ... więc w zasadzie używam tablicy wewnątrz hash ... co się stało, gdy próbowałem zrobić h [: key] << "value2" bez wykonywania h [: key] = [], i kontynuował łączenie ciągów znaków i zwracanie "value1value2", więc domyślam się, że muszę jawnie utworzyć tablicę ... dzięki – bernabas

+0

@bernabasd Zapraszamy! – lucapette

9

Ruby Way, 2nd Edition posiada cały rozdział poświęcony mieszań multi-wartość, jeśli dobrze pamiętam. Bez względu na to, nie ma wbudowanego w to zachowanie.

Jednak można się zabawić, przekazując blok do Hash.new.

$ irb 
>> h = Hash.new { |hash, key| hash[key] = [] } 
=> {} 
>> h[:a] << "Value1" 
=> ["Value1"] 
>> h[:a] << "Value2" 
=> ["Value1", "Value2"] 
>> h 
=> {:a=>["Value1", "Value2"]} 
>> 

Jeśli chcesz []= zawsze dołączyć do wartości, to trzeba małpa plastra. Znowu nic nie jest wbudowane, aby działać w ten sposób.

+1

+1 za przekazanie bloku do 'Hash # new'. Kocham to! – lucapette

Powiązane problemy