Snažím sa inicializovať Hash of Array ako
@my_hash = Hash.new(Array.new)
aby som mohol:
@my_hash["hello"].push("in the street")
=> ["in the street"]
@my_hash["hello"].push("at home")
=> ["in the street", "at home"]
@my_hash["hello"]
=>["in the street", "at home"]
Problém je v tom, že sa vráti aj každý nový kľúč ["in the street", "at home"]
@my_hash["bye"]
=> ["in the street", "at home"]
@my_hash["xxx"]
=> ["in the street", "at home"]
!!! ???
Čo robím nesprávne, čo by bolo správnym spôsobom inicializácie Hash of Arrays?
odpovede:
85 pre odpoveď č. 1@my_hash = Hash.new(Array.new)
Tým sa vytvorí presne jeden objekt poľa, ktorý sa vráti zakaždým, keď kľúč nie je nájdený. Vzhľadom k tomu, že kedykoľvek zmeníte pole a nikdy nevytvoríte nový, všetky kľúče sú mapované do rovnakého poľa.
Čo chcete urobiť, je:
@my_hash = Hash.new {|h,k| h[k] = Array.new }
alebo jednoducho
@my_hash = Hash.new {|h,k| h[k] = [] }
Odovzdávanie bloku Hash.new
sa líši od jednoduchej argumentácie dvomi spôsobmi:
Blok sa spustí vždy, keď nie je nájdený kľúč. Takto získate nové pole vždy. V verzii s argumentom sa tento argument hodnotí raz (predtým
new
sa volá) a výsledok sa vždy vráti.Vykonávaním
h[k] =
vlastne vložte kľúč do hash. Ak to neurobíte, jednoducho pristupujete@my_hash[some_key]
nebude to skutočne spôsobiťsome_key
ktoré sa majú vložiť do hash.
7 pre odpoveď č. 2
Skúste to:
@my_hash = Hash.new { |h, k| h[k] = Array.new }
2 pre odpoveď č. 3
Argument pre Hash.new je predvolená hodnota pre nové hashové kľúče, takže keď odovzdáte odkaz, tento odkaz sa použije pre nové hashové kľúče. Aktualizujete túto referenciu pri volaní ...
hash["key"].push "value"
Musíte prejsť nový odkaz do kľúča hash pred stlačením hodnôt na to ...
hash["key1"] = Array.new
hash["key1"].push "value1"
hash["key2"] = Array.new
hash["key2"].push "value2
Tiež by ste sa mohli pokúsiť zaplniť túto pomôcku aj do pomocnej metódy.