In Ruby ist
attr_accessor ein Makro (oder eine Methode) zur automatischen Erstellung eines Getters (Zugriffsmethode auf den Wert) und eines Setters (Methode zum Setzen des Wertes) für Instanzvariablen (instance variables) in einer Klasse.
Zum Beispiel:
class Cat
end
cat = Cat.new
cat.name # => no method error
Wir haben keine Methode
name in der Klasse
Cat. Offensichtlich erhalten wir einen no method error.
Versuchen wir, einen Getter hinzuzufügen:
class Cat
def name
@name # gibt die Instanzvariable @name zurück
end
end
cat = Cat.new
cat.name # => nil
Es scheint, als wäre etwas schiefgegangen. Aber alles ist richtig. Der Getter cat.name gibt nil zurück. Es gibt keinen 'no method error' mehr, das heißt, die Methode existiert und gibt die Instanzvariable @name der Klasse Cat zurück. Aber diese Variable ist leer. nil ist das erwartete Ergebnis.
In Ruby ist ein
Getter eine Methode, die es ermöglicht, den Wert einer Instanzvariable (instance variable) in einer Klasse abzurufen. Getter werden so genannt, weil sie es ermöglichen, den Wert der Variable zu "erhalten" (
get).
In Ruby werden Getter normalerweise verwendet, um den Zugriff auf die Werte von Variablen von außerhalb der Klasse zu ermöglichen, da Variablen normalerweise privat (private) und nicht direkt zugänglich sind. Getter ermöglichen einen kontrollierten Zugriff auf diese Werte.
Ein Versuch, einen Setter zu verwenden, führt zu einem no method error:
cat.name = 'Ruby'# => no method error
Das ist ebenfalls das erwartete Ergebnis. Wir haben keine Setter-Methode für name.
In Ruby ist ein Setter eine Methode, die es ermöglicht, den Wert einer Instanzvariable (instance variable) in einer Klasse zu setzen. Setter werden so genannt, weil sie es ermöglichen, Werte der Variablen zu "setzen" (
set) (oder bestehende zu ändern).
In Ruby werden Setter verwendet, um die Werte von Variablen von außerhalb der Klasse kontrolliert zu ändern.
class Cat
def name
@name # gibt die Instanzvariable @name zurück
end
def name=(str)
@name = str
end
end
Erstellen wir eine Instanz von Cat und rufen die Methode name (Getter) auf:
cat = Cat.new
cat.name # => nil
Hier ist alles richtig. Unsere Instanz ist derzeit leer. Wir müssen einen Wert über unsere neue Methode (Setter) übergeben.
cat.name = 'Ruby'
Wir sehen keinen Fehler. Also versuchen wir, den Wert über die Getter-Methode abzurufen:
cat.name # => Ruby
Alles funktioniert. Aber stellen Sie sich vor, Ihre Klasse hat nicht nur name, sondern Dutzende verschiedener Attribute (Alter, Farbe usw.). Jedes Mal Getter- und Setter-Methoden zu schreiben, ist nicht sehr praktisch.
Deshalb gibt es in Ruby solche Abkürzungen (attr_reader und attr_writer):
class Cat
attr_reader :name
attr_writer :name
end
:name - der Name des Attributs, für das eine Methode erstellt wird.
attr_reader ist eine Abkürzung für die Getter-Methode:
def name
@name # gibt die Instanzvariable @name zurück
end
attr_writer ist eine Abkürzung für die Setter-Methode:
def name=(str)
@name = str
end
Aber wenn wir beide Methoden - Setter und Getter - benötigen, müssen wir attr_reader und attr_writer für jedes Attribut duplizieren:
class Cat
attr_reader :name
attr_writer :name
attr_reader :color
attr_writer :color
end
Das ist prägnanter, als die Methoden vollständig zu schreiben, aber Ruby ermöglicht es uns, diesen Code noch weiter zu verkürzen. Hier benötigen wir
attr_accessor.
class Cat
attr_accessor :name
attr_accessor :color
end
Entspricht der folgenden Schreibweise:
class Cat
attr_reader :name
attr_writer :name
attr_reader :color
attr_writer :color
end
Die Verwendung von
attr_accessor, attr_reader und attr_writer vereinfacht die Erstellung von Zugriffsmethoden für Variablen in Klassen, und das ist besonders praktisch, wenn Sie nur einfach einen Wert einer Variablen abrufen oder setzen möchten, ohne zusätzliche Logik.
Ruby ermöglicht es, bereits das zu verkürzen, was man für verkürzt hielt. Hier ist eine Variante der kompakten Schreibweise von Attributen durch Kommas:
attr_reader :name, :color