2016-05-04 7 views

Antwort

4

Sie geben dem Hash nicht den Wert zu, Sie geben nur einen Hash und einen unabhängigen Wert 0 zurück. Diese werden modifiziert und dann weggeworfen.

Fix dies durch einen Auftrag ausführen:

test_hash = Hash.new { |h,k| 
    h[k] = Hash.new(0) 
} 

Sie etwas sagen kann, falsch war, weil nach test_hash[1][1] dann Zugriff auf test_hash.inspect nannte es immer noch leer ist.

+1

Der 'Hash.new'-Block wird jedes Mal aufgerufen, wenn ein neuer Schlüssel gefüllt wird, und während Sie nicht verpflichtet sind, etwas mit dem Hash zu tun, ist es normalerweise eine gute Idee, ihn zu ändern. Wenn Sie 'h [k] = ...' oder etwas ähnliches nicht aufrufen, sind Ihre Werte unabhängig vom Hash und werden nicht gespeichert. – tadman

+0

Danke! Warum funktioniert das? test_hash = Hash.new {| h, k | []} test_hash + = ['irgendwas'] –

+0

Ich bekomme "undefinierte Methode' + 'für {}: Hash (NoMethodError) ", was nicht überraschend ist. Das sollte nicht funktionieren. – tadman

2

Tadmans Antwort ist (halbwegs) korrekt, kann aber ein wenig irreführend sein.

Sie weisen dem eingebetteten Hash einen Wert zu, aber nicht den eingebetteten Hash dem Haupt-Hash. Jedes Mal, wenn ein Schlüssel im Haupt-Hash aufgerufen wird, wird ein neuer eingebetteter Hash erstellt. Nachdem Sie dem eingebetteten Hash einen Wert zugewiesen haben, wird der eingebettete Hash, der {1 => 1} geworden ist, nicht dem Haupt-Hash zugewiesen und wird verworfen.

Verwandte Themen