Aliasing variables

Is there a way to do something like
a = 1
alias(b,a)
a += 1
where the desired effect is that now b == 2?

Eliah Hecht wrote:

Is there a way to do something like
a = 1
alias(b,a)
a += 1
where the desired effect is that now b == 2?

It's impossible in the general case, because
a+=1 literally means a=a+1 (in other words,
it creates a new object and assigns that to
a).

Fixnums are not mutable at all. But if an
object is mutable, and an operator modifies
the object rather than creating a new one,
the behavior you want will happen:

    a = "cat"
    b = a
    a << "hode"
    puts b # cathode

However, assignment never keeps the same
object:

    a = "cat"
    b = a
    a += "hode"
    puts b # cat

In short: Assignment works on variables, not
objects; but methods are called on objects,
not variables.

Make sense?

Hal

I know why it doesn't work, I just want to know how to make it work
(if it's doable without making a wrapper object).

···

On Tue, 1 Mar 2005 08:57:41 +0900, Hal Fulton <hal9000@hypermetrics.com> wrote:

Eliah Hecht wrote:
> Is there a way to do something like
> a = 1
> alias(b,a)
> a += 1
> where the desired effect is that now b == 2?
>

It's impossible in the general case, because
a+=1 literally means a=a+1 (in other words,
it creates a new object and assigns that to
a).

Fixnums are not mutable at all. But if an
object is mutable, and an operator modifies
the object rather than creating a new one,
the behavior you want will happen:

    a = "cat"
    b = a
    a << "hode"
    puts b # cathode

However, assignment never keeps the same
object:

    a = "cat"
    b = a
    a += "hode"
    puts b # cat

In short: Assignment works on variables, not
objects; but methods are called on objects,
not variables.

Make sense?

Hal

I mean, can't I just tell ruby that b refers to a, instead of
referring to a's value?

···

On Mon, 28 Feb 2005 16:04:20 -0800, Eliah Hecht <eliahhecht@gmail.com> wrote:

I know why it doesn't work, I just want to know how to make it work
(if it's doable without making a wrapper object).

On Tue, 1 Mar 2005 08:57:41 +0900, Hal Fulton <hal9000@hypermetrics.com> wrote:
> Eliah Hecht wrote:
> > Is there a way to do something like
> > a = 1
> > alias(b,a)
> > a += 1
> > where the desired effect is that now b == 2?
> >
>
> It's impossible in the general case, because
> a+=1 literally means a=a+1 (in other words,
> it creates a new object and assigns that to
> a).
>
> Fixnums are not mutable at all. But if an
> object is mutable, and an operator modifies
> the object rather than creating a new one,
> the behavior you want will happen:
>
> a = "cat"
> b = a
> a << "hode"
> puts b # cathode
>
> However, assignment never keeps the same
> object:
>
> a = "cat"
> b = a
> a += "hode"
> puts b # cat
>
> In short: Assignment works on variables, not
> objects; but methods are called on objects,
> not variables.
>
> Make sense?
>
>
> Hal
>
>

Eliah Hecht wrote:

I know why it doesn't work, I just want to know how to make it work
(if it's doable without making a wrapper object).

OK, sorry. Someone else will benefit from the explanation. :wink:

AFAIK it's impossible without a wrapper object.

Hal

I did. Thanks a lot.

-Shalev

···

On Feb 28, 2005, at 7:06 PM, Hal Fulton wrote:

OK, sorry. Someone else will benefit from the explanation. :wink:

Eliah Hecht wrote:

I mean, can't I just tell ruby that b refers to a, instead of
referring to a's value?

# Entire needlessly included lengthy prior post snipped

Can I ask that people try, when replying to a post, a) trim all but the parts of the prior post that are needed for context, and b) not top-post (that is, please do not put the reply *before* the text being replied to).

Thanks,

James

···

On Mon, 28 Feb 2005 16:04:20 -0800, Eliah Hecht <eliahhecht@gmail.com> wrote:

Sorry about that; Gmail's got me spoiled.
My bad,
-Eliah.

···

On Tue, 1 Mar 2005 14:31:07 +0900, James Britt <jamesUNDERBARb@neurogami.com> wrote:

Can I ask that people try, when replying to a post, a) trim all but the
parts of the prior post that are needed for context, and b) not top-post
(that is, please do not put the reply *before* the text being replied to).