Ruby jest interpretowany. Zmienne są odniesieniami do danych, ale nie do samych danych. Ułatwia to użycie tej samej zmiennej dla danych różnych typów.
Przypisanie lhs = rhs następnie kopiuje odwołanie do rhs, a nie danych. Różni się to w innych językach, takich jak C, gdzie przypisanie kopiuje dane do lhs z rhs.
Tak więc dla wywołania funkcji przekazana zmienna, powiedzmy x, jest rzeczywiście kopiowana do zmiennej lokalnej w funkcji, ale x jest referencją. Będą wtedy dwie kopie referencji, obie odwołujące się do tych samych danych. Jeden będzie w dzwoniącym, jeden w funkcji.
Przypisanie funkcji spowoduje skopiowanie nowego odwołania do wersji x funkcji. Po tym wersja x dzwoniącego pozostaje niezmieniona. Jest to nadal odniesienie do oryginalnych danych.
Natomiast użycie metody .replace na x spowoduje, że Ruby wykona kopię danych. Jeśli zastąpi się przed nowymi przypisaniami, to rzeczywiście dzwoniący zobaczy zmiany danych również w swojej wersji.
Podobnie, dopóki oryginalne odwołanie jest taktowane dla przekazywanej zmiennej, zmienne instancji będą takie same, jak wywołujący. W ramach obiektu zmienne instancji zawsze mają najbardziej aktualne wartości referencyjne, niezależnie od tego, czy są one dostarczane przez obiekt wywołujący, czy ustawione w funkcji, do której klasa została przekazana.
„Call by value” lub „call by reference” jest tu mętne z powodu zamieszania związanego z „=” W językach kompilowanych „=” to kopia danych. Tutaj w tym tłumaczonym języku „=” jest kopią referencyjną. W tym przykładzie przekazano referencję, a następnie kopię referencyjną „=”, która blokuje oryginał przekazany w referencji, a następnie ludzie mówią o tym, jakby „=” była kopią danych.
Aby zachować zgodność z definicjami, musimy zachować „.replace”, ponieważ jest to kopia danych. Z perspektywy „.replace” widzimy, że tak naprawdę jest to odniesienie. Ponadto, jeśli przejdziemy przez debugger, zobaczymy, że przekazywane są referencje, ponieważ zmienne są referencjami.
Jeśli jednak musimy zachować wartość „=” jako odniesienie, wówczas rzeczywiście widzimy przekazane dane aż do przypisania, a następnie nie widzimy go już po przypisaniu, podczas gdy dane dzwoniącego pozostają niezmienione. Na poziomie behawioralnym jest to przekazywanie wartości, o ile nie uważamy, że przekazana wartość jest złożona - ponieważ nie będziemy w stanie zachować jej części, zmieniając drugą część w jednym przydziale (jak to przydział) zmienia odniesienie, a oryginał wychodzi poza zakres). Będzie też brodawka, w tym przypadku zmienne w obiektach będą referencjami, podobnie jak wszystkie zmienne. W związku z tym będziemy zmuszeni mówić o przekazywaniu „referencji według wartości” i musimy używać powiązanych lokalizacji.