In Ruby gibt es einen Unterschied zwischen In-Place Operationen und diejenigen, die eine Kopie zurückgeben. Manchmal gibt der Name einen Hinweis, wie gsub
vs gsub!
, aber andere Zeiten müssen Sie nur wissen, wie <<
.
Was Sie hier tun, ist neu definiert, welches Objekt string
Referenzen, so dass keine dauerhafte Änderung an der ursprünglichen Referenz vorgenommen wird.
Die Zeile string = "hello"
bedeutet nicht, dass sich der ursprüngliche Objektverweis bedtime
ändert.
Wenn Sie diesen Effekt wollten, würden Sie string.replace("hello")
tun, die eine In-Place-Neuzuweisung des Inhalts der Zeichenfolge ist.
Um herauszufinden, auf welches Objekt Sie verweisen, rufen Sie object_id
auf dem Objekt in Frage. Sie werden hier feststellen, dass sich mit Ihrem Code dieser Wert ändert, aber mit replace
nicht.
Ruby-Methode Argumente werden von Objektreferenz übergeben, die in der Praxis viel wie ein Zeiger ist. Wenn Sie erwarten, dass dieser Wert von absoluter Referenz übergeben wird, ist dies nicht der Fall.
Da Ruby ist pass-by-Wert. Die Methode 'a_method' mutiert also nicht den ursprünglichen Verweis auf die Zeichenfolge' "goodnight" ' – user1875195
In Ihrem Fall kommt es auf Ihre Verwendung von' '' '' an, die das Objekt ändert, anstatt nur eine geänderte Version zurückzugeben. Wenn Ihre Methode stattdessen "string +" world "hätte, würde das nicht passieren. –
@ user1875195 Wenn 'a_method' nicht den ursprünglichen Verweis auf den String '' goodnight '' mutierte, dann würde ''goodnight world' 'nicht gedruckt. Die Verkettung von "Welt" mit "Schlafenszeit" mutiert es. –