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.

Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Graziano
Hai qualche domanda da fare?