Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
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
Dieser Beitrag hat noch keine Ergänzungen vom Autor.