Ruby wird interpretiert. Variablen sind Verweise auf Daten, jedoch nicht auf die Daten selbst. Dies erleichtert die Verwendung derselben Variablen für Daten unterschiedlicher Typen.
Die Zuweisung von lhs = rhs kopiert dann die Referenz auf die rhs, nicht die Daten. Dies unterscheidet sich in anderen Sprachen, wie z. B. C, wo die Zuweisung eine Datenkopie von rhs nach lhs durchführt.
Für den Funktionsaufruf wird die übergebene Variable, z. B. x, zwar in eine lokale Variable in der Funktion kopiert, aber x ist eine Referenz. Es gibt dann zwei Kopien der Referenz, die beide auf dieselben Daten verweisen. Einer wird im Anrufer sein, einer in der Funktion.
Die Zuweisung in der Funktion würde dann einen neuen Verweis auf die Funktionsversion von x kopieren. Danach bleibt die Aufruferversion von x unverändert. Es ist immer noch ein Verweis auf die Originaldaten.
Im Gegensatz dazu führt die Verwendung der .replace-Methode für x dazu, dass Ruby eine Datenkopie erstellt. Wenn Ersetzen vor neuen Zuweisungen verwendet wird, sieht der Anrufer die Datenänderung auch in seiner Version.
In ähnlicher Weise sind die Instanzvariablen dieselben, die der Aufrufer sieht, solange die ursprüngliche Referenz für die übergebene Variable gültig ist. Im Rahmen eines Objekts haben die Instanzvariablen immer die aktuellsten Referenzwerte, unabhängig davon, ob diese vom Aufrufer bereitgestellt oder in der Funktion festgelegt wurden, an die die Klasse übergeben wurde.
Der 'Aufruf nach Wert' oder 'Aufruf nach Referenz' ist hier aufgrund der Verwirrung über '=' In kompilierten Sprachen '=' ist eine Datenkopie durcheinander. Hier in dieser interpretierten Sprache ist '=' eine Referenzkopie. In dem Beispiel haben Sie die Referenz übergeben, gefolgt von einer Referenzkopie durch '=', die das als Referenz übergebene Original blockiert, und dann wird darüber gesprochen, als wäre '=' eine Datenkopie.
Um mit den Definitionen übereinzustimmen, müssen wir '.replace' beibehalten, da es sich um eine Datenkopie handelt. Aus der Perspektive von '.replace' sehen wir, dass dies tatsächlich als Referenz gilt. Wenn wir im Debugger durchgehen, sehen wir außerdem, dass Referenzen übergeben werden, da Variablen Referenzen sind.
Wenn wir jedoch '=' als Referenzrahmen beibehalten müssen, können wir die übergebenen Daten tatsächlich bis zu einer Zuweisung sehen, und dann können wir sie nach der Zuweisung nicht mehr sehen, während die Daten des Anrufers unverändert bleiben. Auf Verhaltensebene wird dies als Wert übergeben, solange wir den übergebenen Wert nicht als zusammengesetzt betrachten, da wir nicht in der Lage sind, einen Teil davon beizubehalten, während wir den anderen Teil in einer einzelnen Zuweisung ändern (wie diese Zuweisung) ändert die Referenz und das Original verlässt den Geltungsbereich). Es wird auch eine Warze geben, in diesem Fall sind Variablen in Objekten Referenzen, ebenso wie alle Variablen. Daher werden wir gezwungen sein, über das Übergeben von 'Referenzen nach Wert' zu sprechen und verwandte Positionen zu verwenden.