Objekte können ihren eigenen Zustand speichern, indem sie Instanzvariablen setzen. Diese Variablen leben innerhalb eines Objekts und werden normalerweise verwendet, um einen internen Zustand zu speichern.
Instanzvariablen beginnen immer mit einem @.
Du kannst eine neue Instanzvariable erstellen, indem du eine Variable setzt, die mit einem @ beginnt.
Zum Beispiel:
class Repeater
def hear(something)
# Save what's been heard into a new instance variable called @heard
@heard = something
end
def repeat
# Return the value of the instance variable
@heard
end
end
repeater = Repeater.new
repeater.hear("Hello, friend!")
print repeater.repeat # Prints "Hello, friend!"
Objekte legen ihren Anfangszustand normalerweise in einer initialize-Methode fest, die automatisch aufgerufen wird, wenn du new für eine Klasse aufrufst.
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
Die initialize-Methode kann auch Argumente entgegennehmen, sodass jede Instanz mit einem eigenen Zustand starten kann:
class Suitcase
def initialize(locked)
@locked = locked
end
end
Es ist gute Praxis, Instanzvariablen als privat gegenüber externem Lesen und Schreiben zu betrachten. Stattdessen definieren wir Methoden, um ihre Werte zu lesen und zu setzen. Zum Beispiel:
class Suitcase
def initialize
@locked = false
end
def locked? # Query methods should be named with a trailing `?`
@locked
end
def lock! # Methods which mutate state should have trailing `!`
@locked = true
end
end
suitcase = Suitcase.new
suitcase.locked? # false
suitcase.lock!
suitcase.locked? # true
Nil ist ein englisches Wort und bedeutet „nichts“ oder „null“.
In Ruby wird nil verwendet, um die Abwesenheit eines Objekts auszudrücken.
In anderen Programmiersprachen spielen Werte wie null oder none eine ähnliche Rolle.
# I do not have a favorite color
favorite_color = nil
Ruby gibt jeder Instanzvariable den Standardwert nil, wenn sie zum ersten Mal auftritt, bis ihr anderweitig ein Wert zugewiesen wird.
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
Du arbeitest mit einem Freizeitpark zusammen und hast eine Spezifikation erhalten, um ein System für die Verwaltung von Besuchern und Fahrgeschäften zu entwerfen. Deine Aufgabe ist es, den Attendee (die Person, die den Park besucht) zu modellieren.
Implementiere die Methode Attendee#initialize der Klasse Attendee. Sie soll eine Größe (in Zentimetern) entgegennehmen und als Instanzvariable speichern.
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
Implementiere den Getter Attendee#height der Klasse Attendee. Er soll die Größe der Instanz zurückgeben.
Attendee.new(106).height
# => 106
Nicht alle Besucher haben einen Fahrpass gekauft, aber wir müssen wissen, ob sie einen haben oder nicht. Implementiere den Getter Attendee#pass_id für die Klasse Attendee. Er soll die pass_id der Instanz zurückgeben oder nil, wenn der Attendee keinen hat.
Attendee.new(106).pass_id
# => nil
Implementiere Attendee#issue_pass!, um den Zustand der Instanz zu verändern, und setze die Instanzvariable für die Pass-ID auf das Argument. Die Methode soll die Pass-ID zurückgeben.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
Manche Gäste brechen die Regeln mit unsicherem Verhalten, deshalb möchte der Park Pässe entziehen können. Implementiere Attendee#revoke_pass!, um den Zustand der Instanz zu verändern, und setze die Pass-ID auf nil.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil
Melde dich bei Exercism an, um Ruby mit 21 Konzepte121 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.