Un Hash in python si chiama dict ma funziona in maniera quasi identica a
quelli di ruby. La differenza fondamentale e’ nel fatto che quando cercate un elemento
che non e’ stato ancora inserito ottenete un’eccezione invece di nil.
>> hsh=Hash.new => {} >> hsh[0] => nilin python:
>>> hsh=dict() >>> hsh[0] Traceback (most recent call last): File "<stdin>", line 1, in ? KeyError: 0fortunatamente, in entrambi i linguaggi possiamo creare delle sottoclassi che si comportino diversamente. In ruby, però, possiamo evitare di farlo, creando un singolo
Hash che si comporti come desideriamo.
Infatti ruby ci permette di associare come valore di default di un Hash una procedura, un blocco do..end, che verra’ eseguito ogni volta che richiamiamo una chiave non precedentemente definita. Il metodo e’ semplicissimo:
>> hsh=Hash.new { raise 'Errore!' } => {} >> hsh[0] RuntimeError: Errore! from (irb):31 from (irb):31:in `call' from (irb):32:in `default' from (irb):32:in `[]' from (irb):32 from :0 >> hsh[2] RuntimeError: Errore! from (irb):31 from (irb):31:in `call' from (irb):33:in `default' from (irb):33:in `[]' from (irb):33 from :0Ovviamente, se voleste fare le cose meglio potreste creare una classe
KeyError , ma lascio a voi il piacere :)