Inizializzazione degli oggetti

La nostra classe Frutta del capitolo precedente aveva duevariabili d'istanza, una che descriveva il tipo di fruttoe l'altra per descriverne la condizione. Solo in seguitoalla scrittura di un metodo inspectpersonalizzato per la classe abbiamo scoperto che non avevasenso per un pezzo di frutta non avere tali caratteristiche.Fortunatamente, ruby fornisce un metodo per assicurarsi chele variabili d'istanza vengano sempre inizializzate.

 

Il metodo initialize

Quando Ruby crea un nuovo oggetto, cerca un metodo chiamatoinitialize e lo esegue. Dunque una cosa sempliceche possiamo fare è usare un metodoinitialize per mettere i valori di default intutte le variabili d'istanza, in maniera che ilmetodoinspect abbia qualcosa da dirci.

ruby> class Frutta    |   def initialize    |     @tipo = "mela"    |     @condizione = "matura"    |   end    | end   nilruby> f4 = Frutta.new   "una mela matura"

 

Cambiare le assunzioni in requisiti

Cisaranno sempre delle volte in cui un valore di default non hasenso. Esiste qualcosa come un tipo predefinito di frutta ?Potrebbe essere preferibile richiedere che ogni pezzo difrutta abbia il proprio tipo specificato al momento dellapropria creazione. Per fare ciò, vorremmo aggiungereun argomento formale al metodo initialize. Perragioni nelle quali non entreremo adesso, gli argomenti chefornite a new vengono consegnati ainitialize.

ruby> class Frutta    |   def initialize( k )    |     @tipo= k    |     @condizione = "matura"    |   end    | end   nilruby> f5 = Frutta.new "ciliegia"   "una ciliegia matura"ruby> f6 = Frutta.newERR: (eval):1:in `initialize': wrong # of arguments(0 for 1)

 

Inizializzazione flessibile

Qui sopra vediamoche nel momento in cui un argomento viene associato al metodoinitialize, non può esserne piùseparato senza generare un errore. Se volessimo esserepiù concisi, potremmpo usare l'argomento se civiene fornito, o altrimenti usare dei valori di default.

ruby> class Fruttaa    |   def initialize( k="mela" )    |     @tipo = k    |     @condizione = "matura"    |   end    | end   nilruby> f5 = Frutta.new "ciliegia"   "una ciliegia matura"ruby> f6 = Frutta.new   "una mela matura"

Potete usare argomenti di default per ogni metodo, non soloper initialize. La lista degli argomenti deveessere arrangiata in maniera che quelli con i valori didefault vengano alla fine.

Talvolta è utile fornire differenti modi perinizializzare un oggetto. Anche se è fuori dagli scopidi questo tutorial, ruby supporta la riflessione deglioggetti (objectreflection) e liste di argomenti di lunghezza variabile, cheinsieme permettono l'overloading dei metodi.