Menu
Coddy logo textTech

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.speak

Output:

Rex says Woof
Bella says Woof

I 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.report

Output:

count is 2

Non è 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
end

Output:

Rex
undefined method `age' for an instance of Dog

Una 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_variables

Output:

nil
[:@on]
challenge icon

Sfida

Facile

Completa 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
quiz iconMettiti alla prova

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

Esercitati da solo: Compilatore Ruby online