2011-12-30 11 views
23

mam hash jakRuby - coraz wartość hash

{:key1 => "value1", :key2 => "value2"}

I mam zmienną k które będą miały wartość jako 'key1' lub 'key2'.

Chcę uzyskać wartość k w zmiennej v.

Czy jest jakiś sposób, aby to osiągnąć bez użycia lub case? Preferowane jest rozwiązanie z jedną linią. Proszę pomóż.

Odpowiedz

57

Konwertuj klucz z łańcucha na symbol i wykonaj wyszukiwanie w haśle.

hash = {:key1 => "value1", :key2 => "value2"} 
k = 'key1' 

hash[k.to_sym] # or iow, hash[:key1], which will return "value1" 

Rails używa tej klasy o nazwie HashWithIndifferentAccess, która okazuje się bardzo przydatna w takich przypadkach. Wiem, że oznaczyłeś swoje pytanie tylko Ruby, ale możesz wykraść implementację tej klasy ze źródła Railsów, aby uniknąć ciągu znaków do symbolu i symbolu, aby ciągać konwersje w całym kodzie źródłowym. Udostępnia tę wartość za pomocą symbolu lub łańcucha jako klucza.

hash = HashWithIndifferentAccess.new({:key1 => "value1", :key2 => "value2"}) 
hash[:key1] # "value1" 
hash['key1'] # "value1"