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