Objekte werden in Ruby immer by reference übergeben, da Variablen nichts anderes als Referenzen auf Objekte sind. Aber siehe da:
def inc(n) n = n + 1 end i = 1 inc(i) # => 2 puts i # => 1
Sieht aber so aus als ob Ruby nicht per reference übergeben würde, sondern by value.
Doch ein Blick in Docu zeigt, dass die Methode '+' ein neues Objekt mit dem Wert 2 zurückgibt, auf das nun n zeigt. Während i immer noch auf das alte Objekt mit dem Wert 1 zeigt. Würde Ruby kein neues Objekt erzeugen, sondern den Methoden-Receiver tatsächlich ändern:
a = 1 b = 2 c = a + b
ja dann wäre nach dieser Operation nicht nur c = 3, sondern auch a = 3.
Das ist aber immer noch nicht die ganze Wahrheit. Auch im folgendem Beispiel scheint Ruby by value zu übergeben:
def swap x,y y, x = x, y end a = 1 b = 2 swap a, b puts a # => 1 puts b # => 2
Auch hier zeigt x nach dem Aufruf zwar auf 2, aber a immer noch auf 1. Doch die eigentliche Frage ist, warum werden überhaupt zwei Referenzen gebildet?
Weil Ruby Referenzen by value übergibt!
Übrigens herrscht in der Java-Welt immer noch das Gerücht, dass primitive Types by value übergeben werden und Objekte by reference. Stattdessen verhält sich Java genau gleich.
1 Kommentar:
Gut zu wissen! Wusste auch nicht, dass Java dies so handhabt.
Kommentar veröffentlichen