Metodi d'Accesso
Cos'è un metodo d'accesso?
Abbiamo discusso brevemente delle variabili d'istanza in un capitolo precedente, ma non le abbiamo ancora usate molto . Le variabili d'istanza di un oggetto sono i suoi attributi , le cose che in genarale lo distinguono da altri oggetti della stesa classe. E' importante essere in grado di leggere e scrivere questi attributi; fare ciò richiede la scrittura di metodi detti attribute accessor, metodi d'accesso agli attributi. Vedremo tra un momento che non abbiamo sempre la necesità di scrivere tali metpodi esplicitamente, ma per ora vediamo tutti i passi. I due tipi di [accessori] sono scrittori e lettori.
ruby> class Frutta
| def set_tipo(k) # uno scrittore
| @tipo = k
| end
| def get_tipo # un lettore
| @tipo
| end
| end
nil
ruby> f1 = Frutta.new
#<Frutta:0xfd7e7c8c>
ruby> f1.set_tipo("pesca") # usa lo scrittore
"pesca"
ruby> f1.get_tipo # usa il lettore
"pesca"
ruby> f1 # analizza l'oggetto
#<Frutta:0xfd7e7c8c @tipo="pesca">
Abbastanza semplice; possiamo immagazzinare e recuperare informazioni su che tipo di frutta stiamo osservando. Ma i nostri nomi di metodo sono un po troppo lunghi. Quelliche seguono sono più coincisi, e più convenzionali:
ruby> class Frutta
| def tipo=(k)
| @tipo = k
| end
| def tipo
| @tipo
| end
| end
nil
ruby> f2 = Frutta.new
#<Frutta:0xfd7e7c8c>
ruby> f2.tipo = "banana"
"banana"
ruby> f2.tipo
"banana"
Il metodo inspect
Una breve digressione è necessaria. Ormai avrete
notato che quando cerchiamo di guardare un oggetto
direttamente, ci vine mostrato qualcosa di criptico
come#<unOggetto:0x83678>. Questo è
soltanto il comportamento predefinito, e siamo liberi di
cambiarlo. Tutto ciò di cui abbiamo bisogno è
di aggiungere un metodo chiamato inspect. Esso
dovrebbe restituire una tringa che descriva l'oggetto in
qualche maniera utile, incluso lo stato di alcune o tutte le
variabili d'istanza.
ruby> class Frutta
| def inspect
| "un frutto della varietà " + @tipo
| end
| end
nil
ruby> f2
"un frutto della varietà banana"
Un metodo correlato è to_s (converte a
stringa), che viene usato per stampare un oggetto. In
generale, potete pensare a inspect come ad uno
strumento per la scrittura ed il debug dei programmi, ed a
to_s come ad un modo per raffinare l'output
di un programma. eval.rb usainspect
quando mostra un risultato. Potete usare il metodo
p per ottenere semplicemente output di debug dai
programmi .
# queste due linee sono equivalenti: p unOggetto print unOggetto.inspect, ""
Creare metodi d'accesso nel modo facile
Poiché molte variabili d'istanza necessitano di metodi d'accesso, Ruby fornisce scorciatoie convenienti per le forme standard.
| Scorciatoia | Effetto |
attr_reader :v
|
def v; @v; end
|
attr_writer :v
|
def v=(valore); @v=valore; end
|
attr_accessor :v
|
attr_reader :v; attr_writer :v
|
attr_accessor :v, :w
|
attr_accessor :v; attr_accessor :w
|
Adesso avvantaggiamoci di questo ed aggiungiamo informazioni
sulla freschezza. Primo chiediamo un lettore ed uno scrittore
genrati automaticamente, e poi incorporiamo le nuove
informazioni in inspect:
ruby> class Frutta
| attr_accessor :condizione
| def inspect
| "una " + @tipo + " " + @condizione
| end
| end
nil
ruby> f2.condizione = "matura"
"matura"
ruby> f2
"una banana matura"
Più divertimento con la frutta
Se nessuno mangia la nostra frutta matura forse dovremmo far si che il tempo si prenda il suo pegno.
ruby> class Frutta
| def tempo_passa
| @condizione = "marcia"
| end
| end
nil
ruby> f2
"una banana matura"
ruby> f2.tempo_passa
"marcia"
ruby> f2
"una banana marcia"
Ma nel giocare con questa roba, abbiamo introdotto un piccolo problema. Cosa succede se cerchiamo di produrre un terzo pezzo di frutta adesso? Ricordate che le variabili d'istanza non esistono finchè non le viene assegnato un valore .
ruby> f3 = Frutta.new ERR: failed to convert nil into String
E' il metodo inspect che si stan lamentando
adesso, e con una buona ragione. Abbiamo chiesto di riportare
il tipo e la condizione di un pezzo di frutta, ma
f3 non ha ancora nessun valore assegnato agli
attributi. Se avessimo voluto , avremmo potuto riscrivere il
metodo inspect in modo che controlli le
variabili usando il metodo defined?e solo nel
caso siano definite le riporti, ma forse ciò non
sarebbe troppo utile; poiché ogni pezzo di frutta ha
un tipo ed una condizione, sembra che dovremmo preoccuparc di
avere tali valori definiti in ogni caso. Questo è
l'argomento del prossimo capitolo.
- Articolo precedente Gestione delle Eccezioni : ensure
- Articolo successivo Inizializzazione degli oggetti