Menu
Coddy logo textTech

Instanzvariablen

Teil des Abschnitts Objektorientierte Programmierung der Ruby-Journey von Coddy. Lektion 3 von 57.

Eine Instanzvariable beginnt mit @ und gehört zu einem Objekt. Ein in initialize gespeicherter Wert bleibt für jede Methode dieses Objekts verfügbar, und jede Instanz besitzt ihre eigene Kopie:

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

Ausgabe:

Rex says Woof
Bella says Woof

Methoden können Instanzvariablen ändern, sodass sich ein Objekt daran erinnert, was mit ihm geschehen ist. Zusammen bilden seine Instanzvariablen den Zustand des Objekts:

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

Ausgabe:

count is 2

Auf Instanzvariablen kann nicht von außerhalb des Objekts zugegriffen werden. Code außerhalb kann nur Methoden aufrufen. Daher definiert eine Klasse, die einen Wert teilen möchte, eine Methode, die ihn zurückgibt, einen Reader:

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

Ausgabe:

Rex
undefined method `age' for an instance of Dog

Eine Instanzvariable, der nie ein Wert zugewiesen wurde, ist nil und löst keinen Fehler aus. Daher liest ein falsch geschriebener Name unbemerkt eine andere, leere Variable. instance_variables listet die Variablen auf, die ein Objekt tatsächlich besitzt:

class Lamp
  def initialize
    @on = false
  end

  def status
    @onn.inspect
  end
end

lamp = Lamp.new
puts lamp.status
p lamp.instance_variables

Ausgabe:

nil
[:@on]
challenge icon

Aufgabe

Einfach

Vervollständige die Klasse Pet. initialize(name, species, age) speichert die drei Werte, birthday addiert ein Jahr zum Alter, und describe gibt einen Satz zurück: Ein Haustier namens Rex mit der Tierart dog und dem Alter 3 ergibt Rex is a 3 year old dog.

Der bereitgestellte Code erstellt aus den ersten drei Eingabezeilen (Name, Tierart, Alter) ein Pet, ruft birthday so oft auf, wie es die vierte Zeile angibt, und gibt describe aus.

Dein Code gehört in pet.rb. main.rb enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

require_relative 'pet'

# Gelieferter Ein-/Ausgabe-Code: belasse ihn wie er ist
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-Ruby-Compiler