Ruby-Klasseninstanzvariablen [duplizieren]

8

Kann jemand den Unterschied zwischen den folgenden erklären, und warum ist es nicht so, wie man es erwarten könnte:

%Vor%

Soweit ich es verstanden habe, müssen Sie bei der Zuweisung das Schlüsselwort self verwenden. Warum kannst du das nicht in einer initialize -Methode verwenden? Oder kannst du? Ich habe versucht, es zu benutzen und es schien nicht wie erwartet zu funktionieren, ich bin nur verwirrt, welche Technik zu verwenden und wann und wichtiger warum .

Ich hoffe wirklich, dass jemand das für mich ein für allemal klären kann:)

    
Blankman 02.09.2012, 23:31
quelle

2 Antworten

15

Version 1: Der Konstruktor erstellt zwei Instanzvariablen, @name und @age . Diese beiden Variablen sind privat (wie alle Ruby-Instanzvariablen), sodass Sie nicht außerhalb der Klasse darauf zugreifen können.

Version 2: Exakt dasselbe wie # 1, außer dass Sie auch eine Getter- und Setter-Methode für die zwei Variablen definieren. Was attr_accessor macht, erzeugt zwei Methoden für jeden Parameter, mit denen Sie den Wert der Instanzvariablen mit demselben Namen erhalten / setzen können.

Version 3: Exakt wie # 2, außer dass Sie in Ihrem Konstruktor die Instanzvariablen nicht direkt setzen, sondern stattdessen die Methoden User#name= und User#age= aufrufen, um den Wert Ihrer Instanzvariablen anstatt zu setzen Setzen Sie sie direkt.

Um den Unterschied zwischen dem direkten Setzen der Instanzvariablen und dem Aufruf einer Setter-Methode zu verdeutlichen, betrachten Sie dieses Beispiel:

%Vor%

Hier setzen Sie die @name Variable von user nicht direkt, stattdessen rufen Sie eine Methode namens name= für user auf, die den Wert von @name für Sie festlegt. Wenn Sie in den Versionen 2 und 3 den Aufruf von attr_accessor ausgeführt haben, hat er diese Methode für Sie definiert. In Version # 1 haben Sie jedoch attr_accessor nicht aufgerufen, daher wäre das obige Beispiel ungültig, da es keine Methode name= gibt.

    
robbrit 02.09.2012 23:47
quelle
0

Sie müssen nicht selbst in einer Methode verwenden; Für eine Instanzvariable sollten Sie wie in Version 1 oder 2 direkt mit @ zuweisen. self ist nicht wie in Python; Es wird zum Beispiel verwendet, um eine Klassenmethode (wie statische Funktion in C ++) zu deklarieren.

    
Aleksander 02.09.2012 23:39
quelle

Tags und Links