--001485f7cbf482cc310491adc999
Content-Type: text/plain; charset=ISO-8859-1

On Sat, Oct 2, 2010 at 8:56 PM, Caleb Clausen <vikkous / gmail.com> wrote:

> Rather than inventing a new class to do pass-by-reference, I'd
> advocate using one that already exists: Array. So then you could call
> the method like this:
>
> a  1]
> b  2]
> puts "initially: aa[0]}, bb[0]}"
> change_value a , b
> puts "after: aa[0]}, bb[0]}"
>
>
Interestingly, that would bring it very much in line with the C example,
since pointers and arrays in C are (almost) the same thing.

It's just that in the case of Fixnums (and a few other things) it is
> not possible to have references at all; such objects are always stored
> (and passed) by value
>

If it were pass by value, I would expect it to make a new object each time
it passes that object.

def mutate_myvar(remote)
  remote.instance_eval { @myvar  bye" }
end
def oid(remote)
  remote.send :object_id
end
local  
local.class                             # Fixnum
local.instance_eval { @myvar  hi" }
local.instance_eval { @myvar }          # "hi"
mutate_myvar(local)
local.instance_eval { @myvar }          # "bye"
local.send(:object_id) oid(local)    # true


So it doesn't make a new object, which means that we are dealing with the
same object after passing it. I would expect this is because the method
received a reference to the same object that main is using, and would thus
expect it to be pass by reference. I would agree that it behaves like pass
by value, because it has no mutators.

--001485f7cbf482cc310491adc999--