Ich habe Schwierigkeiten, attr_accessor
in Ruby zu verstehen. Kann mir das jemand erklären?
attr_accessor ist nur eine Methode. (Der Link sollte einen besseren Einblick in die Funktionsweise geben - schauen Sie sich die erzeugten Methodenpaare an, und ein Tutorial sollte Ihnen zeigen, wie man sie verwendet).
Der Trick ist, dass class
in Ruby keine Definition ist (in Sprachen wie C++ und Java ist es "nur eine Definition"), sondern ein Ausdruck, der ausgewertet wird. Während dieser Auswertung wird die Methode attr_accessor
aufgerufen, die wiederum die aktuelle Klasse modifiziert - denken Sie an den impliziten Empfänger: self.attr_accessor
, wobei self
das "offene" Klassenobjekt zu diesem Zeitpunkt ist.
Die Notwendigkeit für attr_accessor
und Freunde, ist, nun ja:
Ruby, wie Smalltalk, erlaubt es nicht, auf Instanzvariablen außerhalb von Methoden1 für dieses Objekt zuzugreifen. Das heißt, auf Instanzvariablen kann nicht in der Form x.y
zugegriffen werden, wie es etwa in Java oder sogar Python üblich ist. In Ruby wird y
immer als eine zu sendende Nachricht (oder "aufzurufende Methode") verstanden. Daher erzeugen die attr_*
-Methoden Wrapper, die den Zugriff auf die Instanz @variable
durch dynamisch erstellte Methoden ersetzen.
Boilerplate saugt
Ich hoffe, dies klärt einige der kleinen Details. Viel Spaß beim Codieren.
1 Das ist nicht ganz richtig und es gibt einige "Techniken" um dies zu umgehen, aber es gibt keine Syntaxunterstützung für den Zugriff auf "öffentliche Instanzvariablen".
Im Grunde täuschen sie öffentlich zugängliche Datenattribute vor, die Ruby nicht hat.