Robert Klemme
1/27/2007 11:57:00 AM
On 27.01.2007 12:10, dblack@wobblini.net wrote:
> Hi --
>
> On Sat, 27 Jan 2007, Robert Klemme wrote:
>
>> On 27.01.2007 01:43, dblack@wobblini.net wrote:
>>> Hi --
>>>
>>> On Sat, 27 Jan 2007, Martin C. Martin wrote:
>>>
>>>> Phrogz wrote:
>>>>> If you pass an immutable type by reference, does it make a sound?
>>>>> Er, I mean...
>>>>> If you passed an immutable type by reference, how would you know that
>>>>> it wasn't passed by value?
>>>>
>>>> Is there any way for the function you're calling to modify the value
>>>> of the variable in the caller? Pass by reference can do that.
>>>
>>> You can modify the object to which the variable refers:
>>>
>>> def change_me(obj)
>>> obj << "hi"
>>> end
>>>
>>> arr = [1,2,3]
>>> change_me(arr)
>>> p arr # [1, 2, 3, "hi"]
>>>
>>> In this example, arr contains a reference to an array. In change_me,
>>> obj contains another copy of the same reference, so you can use it to
>>> manipulate and change the original array.
>>>
>>> I still wouldn't call this pass by reference (see my earlier post in
>>> this thread).
>>
>> Absolutely right: Ruby uses pass by value - with references.
>>
>> irb(main):004:0> def foo(x) x = 10 end
>> => nil
>> irb(main):005:0> def bar; x = 20; foo(x); x end
>> => nil
>> irb(main):006:0> bar
>> => 20
>> irb(main):007:0>
>
> I'm not sure that demonstrates the "values that are references" thing,
> though. You're reassigning to x in foo, which creates a new local x;
> but I think that's just part of the assignment semantics. Or are you
> assuming that if pass by reference were involved, then assignment
> would work differently?
I probably should have chosen different variable names. I was trying to
make the point, that you cannot change a variable in bar by assigning in
foo.
Kind regards
robert