2016-01-05 5 views
10
h = { 
    data: { 
    user: { 
     value: "John Doe" 
    } 
    } 
} 

Aby przypisać wartość do zagnieżdżonego hasha, możemy użyćBezpiecznie przypisać wartości do zagnieżdżonych hash za pomocą krzyżyka # dig lub Lonely operator (&).

h[:data][:user][:value] = "Bob" 

Jednakże jeżeli jakakolwiek część w środku brakuje , spowoduje to błąd.

Coś

h.dig(:data, :user, :value) = "Bob" 

nie będzie działać, ponieważ nie ma Hash#dig= jeszcze dostępne.

Aby bezpiecznie przypisać wartość, możemy zrobić

h.dig(:data, :user)&.[]=(:value, "Bob") # or equivalently 
h.dig(:data, :user)&.store(:value, "Bob") 

Ale czy istnieje lepszy sposób to zrobić?

+2

Na co warto, to zostało omówione tutaj (i odrzucone przez Matza (na razie): https://bugs.ruby-lang.org/issues/11747 –

Odpowiedz

8

To nie jest bez jego zastrzeżeniami (i nie działa, jeśli jesteś otrzymaniu hash z zewnątrz), ale wspólne rozwiązanie to:

hash = Hash.new {|h,k| h[k] = h.class.new(&h.default_proc) } 

hash[:data][:user][:value] = "Bob" 
p hash 
# => { :data => { :user => { :value => "Bob" } } } 
+0

Niestety, hash był z innego miejsca, ale dzięki za fragment! – sbs

+4

Możesz także ustawić domyślny proces dla istniejących skrótów: 'hsh.default_proc = proc {| h, k | h [k] = Hash.new (& h.default_proc)}' – Stefan

Powiązane problemy