Variabili d'istanza
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 3 di 57.
Una variabile di istanza inizia con @ e appartiene a un oggetto. Un valore memorizzato in initialize rimane disponibile per ogni metodo di quell'oggetto, e ogni istanza ha la propria copia:
class Dog
def initialize(name)
@name = name
end
def speak
"#{@name} says Woof"
end
end
rex = Dog.new("Rex")
bella = Dog.new("Bella")
puts rex.speak
puts bella.speakOutput:
Rex says Woof
Bella says WoofI metodi possono modificare le variabili di istanza, così un oggetto ricorda ciò che gli è successo. Insieme, le sue variabili di istanza costituiscono lo stato dell'oggetto:
class Counter
def initialize
@count = 0
end
def increment
@count += 1
end
def report
"count is #{@count}"
end
end
clicks = Counter.new
clicks.increment
clicks.increment
puts clicks.reportOutput:
count is 2Non è possibile accedere alle variabili di istanza dall'esterno dell'oggetto. Il codice esterno può solo chiamare metodi, quindi una classe che vuole condividere un valore definisce un metodo che lo restituisce, un lettore:
class Dog
def initialize(name)
@name = name
end
def name
@name
end
end
rex = Dog.new("Rex")
puts rex.name
begin
rex.age
rescue NoMethodError => e
puts e.message
endOutput:
Rex
undefined method `age' for an instance of DogUna variabile di istanza a cui non è mai stato assegnato un valore è nil e non genera alcun errore, quindi un nome scritto male legge silenziosamente una variabile diversa e vuota. instance_variables elenca le variabili che un oggetto possiede davvero:
class Lamp
def initialize
@on = false
end
def status
@onn.inspect
end
end
lamp = Lamp.new
puts lamp.status
p lamp.instance_variablesOutput:
nil
[:@on]Sfida
FacileCompleta la classe Pet. initialize(name, species, age) memorizza i tre valori, birthday aggiunge un anno all'età e describe restituisce una frase: un animale domestico chiamato Rex, di specie dog e di età 3 dà Rex is a 3 year old dog.
Il codice fornito crea un Pet usando le prime tre righe di input (nome, specie, età), chiama birthday tante volte quante indicate dalla quarta riga e stampa describe.
Il tuo codice va in pet.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'pet'
# Codice di input/output fornito: lascialo così com'è
input = []
while (line = gets)
input << line.chomp
end
pet = Pet.new(input[0], input[1], input[2].to_i)
input[3].to_i.times { pet.birthday }
puts pet.describe
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online