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:)
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.
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.
Tags und Links ruby