Ich dachte, ich verstanden, was die Standardmethode auf einen Hash tut ...Rubin Hash .default auf eine Liste Einstellung
einen Standardwert für einen Schlüssel geben, wenn es nicht existiert:
irb(main):001:0> a = {}
=> {}
irb(main):002:0> a.default = 4
=> 4
irb(main):003:0> a[8]
=> 4
irb(main):004:0> a[9] += 1
=> 5
irb(main):005:0> a
=> {9=>5}
Alles gut.
Aber wenn ich die Standardeinstellung eine leere Liste oder leere Hash sein, verstehe ich nicht, es ist das Verhalten bei alle ....
irb(main):001:0> a = {}
=> {}
irb(main):002:0> a.default = []
=> []
irb(main):003:0> a[8] << 9
=> [9] # great!
irb(main):004:0> a
=> {} # ?! would have expected {8=>[9]}
irb(main):005:0> a[8]
=> [9] # awesome!
irb(main):006:0> a[9]
=> [9] # unawesome! shouldn't this be [] ??
Ich hatte gehofft,/erwarten das gleiche Verhalten als ob ich den || = Operator verwendet hätte ...
irb(main):001:0> a = {}
=> {}
irb(main):002:0> a[8] ||= []
=> []
irb(main):003:0> a[8] << 9
=> [9]
irb(main):004:0> a
=> {8=>[9]}
irb(main):005:0> a[9]
=> nil
Kann mir jemand erklären, was vor sich geht?
gute Erklärung, macht Sinn –
Ich möchte darauf hinweisen, dass dieses Verhalten unterscheidet sich von Python defaultdict, wo der analoge Code funktioniert gut. –
Wow, das ist schrecklich und furchtbar anfällig für Bugs, indem dieser Standardwert dynamisch geändert wird. Ich habe gerade 3 Stunden damit verbracht herauszufinden, ob wtf lief, als ich versuchte, den Standard auf [] zu setzen. IMNSHO, Standard sollte nicht so angezeigt werden. Die Alternative (h = Hash.neu {| h, k | h [k] = []} tut nicht wirklich das, was ich will, weil das immer ein neues Array erzeugt, indem man nur den Hash-Schlüssel referenziert. Jetzt bin ich wieder dabei, das zu tun, was ich eigentlich vermeiden wollte: h [k] = [] es sei denn h.has_key? (K) :) –