Was ist attr_accessor in Ruby?

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:

  1. 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.

  2. 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".

Kommentare (2)

Der attr_accessor ist sehr einfach:

attr_accessor :foo

ist eine Abkürzung für:

def foo=(val)
  @foo = val
end

def foo
  @foo
end

es ist nichts anderes als ein Getter/Setter für ein Objekt

Kommentare (2)

Im Grunde täuschen sie öffentlich zugängliche Datenattribute vor, die Ruby nicht hat.

Kommentare (3)