Note: Testo rimosso dalla rev 1  e Testo aggiunto nella rev2

HashJavaScriptLike

JavaScript possiede, come molti linguaggi di alto livello, una struttura dati rappresentante un Hash/dizionario.

Un hash viene creato e si usa piu’ o meno come in ruby:


 var mioHash = {};
 mioHash["kiave"] = "valore";
mioHash["kiave"] = "valore";

Ma, nel caso la chiave sia una stringa valida anche come identificatore (cioe’ se contiene solo valori alfanumerici e “_“) si puo’ usare questa sintassi:

mioHash.kiave
 mioHash.kiave = "valore";"valore";

In ruby, questo comportamento e’ molto semplice da ottenere, usando method_missing(). Il metodo method_missing(), se definito in una classe, viene richiamato ogni volta che su di un’istanza di quella classe viene richiamato un metodo che non esiste. Come parametri gli vengono passati: (1) # un simbolo rappresentante il nome del metodo (2) # un array contenente i parametri passati al metodo (3) # un eventuale blocco passato al metodo

Ad esempio:

 >> class Mia
 >>  def method_missing(sym,args,&blk)method_missing(sym,*args,&blk)
 >>    puts ‘chiamato: ‘+sym.to_s
 >>    puts ‘con argomenti: ‘+args.inspect
 >>    puts ‘ed un blocco’ if blk
 >>  end
 >> end
 => nil
 >> m=Mia.new
 => #
 >> m.ciao
 'chiamato: ciao'+sym.to_s
 >>    puts 'con argomenti: []'+args.inspect
 =>>>    puts nil
 >> m.ciao 1 ,2 ,3
 chiamato: ciao
 con argomenti: [1, 2, 3]
 => nil
 >> m.ciao(1 ,2 ,3) { lol }
 chiamato: ciao
 con argomenti: [1, 2, 3]
 'ed un blocco' if blk
 >>  end
 >> end
 => nil

>> m=Mia.new => #<Mia:0x27762c8> >> m.ciao chiamato: ciao con argomenti: [] => nil >> m.ciao 1 ,2 ,3 chiamato: ciao con argomenti: [1, 2, 3] => nil >> m.ciao(1 ,2 ,3) { lol } chiamato: ciao con argomenti: [1, 2, 3] ed un blocco => nil

Dunque, ci basta definire questo metodo in maniera appropriata per la class Hash:


 >> class Hash
 >>  def method_missing(sym,args,&blk)
   self[sym.to_s]method_missing(sym,*args,&blk)
 >>    self[sym.to_s]
 >>  end
	
 >> end
	
 => nil
	hsh={}
	
 >> hsh={}
 => {}
	hsh[‘ciao’]=’bau’
	
 >> hsh['ciao']='bau'
 => “bau” 
	hsh.ciao
	"bau" 
 >> hsh.ciao
 => “bau”

"bau"
Created on November 25, 2005 13:37 by il gruppo (256.256.256.256)