[ruby] Generowania zagnieżdżonego hasha - refactoring

Hej,

Mam problem z refactorowaniem kodu.
Powiedzmy, że mam plik, w którego liniach mam dane o pewnych abonentach. Każda linia zawiera kod miejscowości (simc), kod ulicy (ulic), numer budynku (house_no) i dodatkowe informacje o usługach.
Czytam plik linia po linii i tworzę hash @nodes:

@file.each_line do |line|
        col = line.split(/;/)
        next unless col.size == 7
        node_id, simc, address = col[0], col[2], col[3]
        @nodes[simc] = {} unless @nodes[simc]
        ret = parse_address(address, simc)
        ulic = ret['street']
        hn = ret['house_no']
        @nodes[simc][ulic] = {} unless @nodes[simc][ulic]
        @nodes[simc][ulic][hn] = {} unless @nodes[simc][ulic][hn]
        @nodes[simc][ulic][hn]['x_node'] = [] unless @nodes[simc][ulic][hn]['x_node']
        @nodes[simc][ulic][hn]['x_node'] << ret['x_node']

(…)

Otóż nie podoba mi się inicjowanie zagnieżdżonych hashy i tablicy w ten sposób:
@nodes[simc][ulic] = {} unless @nodes[simc][ulic]
Czuję, ze da się to zrobić jakoś lepiej. W każdym razie, jeżeli pierwszy raz trafię na jakiś kod ulicy, to bez zainicjowania tego hasha otrzymam oczywiście błąd próbując dopisać tam kolejny “level”.

Wymodziłem takiego potworka… który działa, poprzedni kod wygląda lepiej, ale ten robaczek nie bardzo :slight_smile:

@nodes = Hash.new { |h1, k1| h1[k1] = Hash.new { |h2, k2| h2[k2] = Hash.new { |h3, k3| h3[k3] = Hash.new { |h4, k4| h4[k4] = [] } } } }

@nodes[simc][ulic] ||= {}

Ten potworek z 2go posta nie jest dobrym kierunkiem.

Masz rację, dobry operator… wyrzuciłem do metody prywatnej rozszerzenie hasha w ten sposób i teraz wygląda wszystko ok.