Hier ist ein Code:
class Person
def initialize(age)
@age = age
end
def age
@age
end
def age_difference_with(other_person)
(self.age - other_person.age).abs
end
protected :age
end
Was ich wissen möchte, ist der Unterschied zwischen der Verwendung @age
und self.age
in age_difference_with
Verfahren.
quelle
Der Unterschied besteht darin, dass die Verwendung der Methode von der Implementierung isoliert wird. Wenn sich die Implementierung der Eigenschaft ändern sollte - beispielsweise um das Geburtsdatum beizubehalten und dann das Alter basierend auf der Zeitdifferenz zwischen jetzt und dem Geburtsdatum zu berechnen -, muss sich der Code je nach Methode nicht ändern. Wenn die Eigenschaft direkt verwendet würde, müsste die Änderung auf andere Bereiche des Codes übertragen werden. In diesem Sinne ist die direkte Verwendung der Eigenschaft fragiler als die Verwendung der von der Klasse bereitgestellten Schnittstelle.
quelle
Seien Sie gewarnt, wenn Sie eine Klasse erben, von
Struct.new
der aus Sie einen Intializer erstellen können ( Wie wird ein Initialisierer in Ruby generiert? )wird zurückkehren
Wenn Sie jedoch den Initialisierer entfernen, wird er zurückgegeben
Mit der Klassendefinition
Sie sollten den Konstruktor angeben.
wird zurückkehren
quelle
Die erste Antwort ist völlig richtig, aber als relativer Neuling war mir nicht sofort klar, was es bedeutete (Nachrichten an sich selbst senden? Huh ...). Ich denke, dass ein kurzes Beispiel helfen wird:
quelle
Es gibt keinen Unterschied. Ich vermute, dass dies nur für den dokumentarischen Wert des Sehens
self.age
und derother_person.age
Nähe zueinander getan wurde .Ich nehme an, dass die Verwendung es ermöglicht, in Zukunft einen tatsächlichen Getter zu schreiben, was etwas Komplexeres bewirken könnte, als nur eine Instanzvariable zurückzugeben, und in diesem Fall müsste sich die Methode nicht ändern.
Aber das ist eine unwahrscheinliche Abstraktion, über die man sich Sorgen machen muss. Wenn sich die Implementierung des Objekts ändert, ist es sinnvoll, andere Methoden zu ändern. Irgendwann ist eine einfache Referenz innerhalb des Objekts selbst durchaus sinnvoll.
In jedem Fall erklärt die Abstraktion der
age
Eigenschaft immer noch nicht die explizite Verwendung vonself
, da einfach nurage
der Accessor aufgerufen hätte.quelle
@age - ist definitiv das instanzvariable Alter
self.age - bezieht sich auf das Alter der Instanzeigenschaft.
quelle