/ Ako môžem inicializovať pole v Hash v Ruby - rubín, matice, hash

Ako môžem inicializovať pole v Hash v Ruby - rubín, polia, hash

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:

  1. 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.

  2. 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.