aliasing variables

E

Eliah Hecht

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

Hal Fulton

Eliah said:
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
 
E

Eliah Hecht

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).
 
E

Eliah Hecht

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

Hal Fulton

Eliah said:
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. ;)

AFAIK it's impossible without a wrapper object.


Hal
 
A

Assaph Mehr

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

To my understanding no. All variables are at the same distance from the
objects they refer to. There is no 'variable' object, variables are
just local names for objects. Thus a variable can only refer to an
object, not another variable. You can not create a pointer-to-pointer
using variables.

You can create wrapper objects using delegate.rb in the std-lib. This
is the closest to what you need.

irb(main):001:0> require 'delegate'
=> false
irb(main):003:0> foo = SimpleDelegator.new 'a'
=> "a"
irb(main):004:0> bar = foo
=> "a"
irb(main):005:0> foo == bar
=> true
irb(main):006:0> foo.__setobj__ 'b'
=> "b"
irb(main):007:0> foo == bar
=> true
irb(main):008:0> bar
=> "b"

Note however that if you simply assign to foo (e.g. foo = 'b') you will
rebind the local name 'foo' to another object (the string 'b'). The
local name 'bar' will still reference the delegator object.

HTH,
Assaph
 
J

James Britt

Eliah said:
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
 
E

Eliah Hecht

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).
Sorry about that; Gmail's got me spoiled.
My bad,
-Eliah.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,169
Messages
2,570,919
Members
47,458
Latest member
Chris#

Latest Threads

Top