In the following, input_1
changes:
def method_1(a)
a << "new value"
end
input_1 = []
method_1(input_1)
input_1 #=> ["new value"]
In the following, input_2
does not change:
def method_2(a)
a = ["new value"]
end
input_2 = []
method_2(input_2)
input_2 #=> []
Why does input_1
change while input_2
doesn't change?
It boils down to Ruby using "pass-reference-by-value".
The exact case that you encounter is described in this excellent blog post.
In method_1
you are changing the value of an object that two different variables (input_1
and a
) are both pointing to.
In method_2
you are reassigning a completely new object to one of the two variables (a
).
With a bit of simplification we can say that a variable in Ruby is a reference to a value. In your case variable a
holds a reference to an array.
a <<
(a.append
) mutates the value stored in variable a
. The reference is not changed, but the value did. It's the case of method_1
def method_1(a)
a << "new value"
end
Assignment =
changes the reference stored in a variable - it starts to point to a different value. References are copied when passed to a method. Because of that when you call
def method_2(a)
a = ["new value"]
end
input = []
method_2(a)
You only change a reference stored in a
that is local to the method, without any change to the reference stored in input
nor to the value (and array of []
) that is pointed by this reference.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With