Bei der Vorbereitung einer Schulung für Ruby bin ich auf eine verwirrende Eigenschaft gestossen:
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.