Point an element in Hash Object


#1

I’m trying to create an hash object using object string for key and
value.
I need to link a key with another key as value… so an element of hash
object can point to another element. But i need the link to the key and
not a copy of the value.

I have tried in this way:
@my_hash[“one”] = “First”
@my_hash[“two”] = “Second”
@my_hash[“three”] = “Third”
@my_hash[“four”] = @my_hash[“T1”]

Now if I modify
@my_hash[“one”] = “Modify”
I would like to see the new value also for
@my_hash[“four”] => “Modify”
but I see “First” because i think it do a copy.

The problem is that i woult like to refer the element end not to copy
it.
Thanks so much and sorry for my english.

Andreaw


#2

On Wed, 30 Nov 2005 22:05:53 -0000, Andrew removed_email_address@domain.invalid
wrote:

@my_hash[“four”] = @my_hash[“T1”]

Andreaw

(Caveat: Fairly new to Ruby)

You actually do have a reference - AFAIU so far, pretty much everything
is
passed by reference (except references, which are passed by value ;)).
Prior to your ‘@my_hash[“one”] = “Modify”’ they do both reference the
same
object, but then you replace the reference with a new reference, to a
string “Modify”.

Swap

@my_hash["one"] = "Modify"

for

@my_hash["one"].sub!(/First/,'Modify')

and you should get the result you want, because ‘sub!’ modifies the
receiver, so no new reference is assigned to @my_hash[“one”].

(N.B. that this just illustrates the problem more, it’s not a general
solution. For that I’d probably use a holder for the string (maybe an
one-element array), but I don’t fully know what Ruby has to offer
instead
yet :wink:


#3

Ross B. a écrit :

@my_hash[“one”] = “First”
The problem is that i woult like to refer the element end not to copy
;)). Prior to your ‘@my_hash[“one”] = “Modify”’ they do both reference
the same object, but then you replace the reference with a new
reference, to a string “Modify”.

Swap

@my_hash["one"] = "Modify"

for

@my_hash["one"].sub!(/First/,'Modify')

@my_hash[“one”].replace ‘Modify’
is better

and you should get the result you want, because ‘sub!’ modifies the
receiver, so no new reference is assigned to @my_hash[“one”].

(N.B. that this just illustrates the problem more, it’s not a general
solution. For that I’d probably use a holder for the string (maybe an
one-element array), but I don’t fully know what Ruby has to offer
instead yet :wink:


Lionel T.

Personal web site: http://users.skynet.be/lthiry/


#4

Hi –

On Thu, 1 Dec 2005, Ross B. wrote:

(P.s. is ‘replace’ one of the ‘!’ convention exceptions, or is there another
reason it doesn’t have a ‘!’ ?)

It’s not an exception: the convention is that when there’s a pair of
methods that differ only in that one is more “dangerous” than the
other, they have the same name but the dangerous one has a ! on the
end. replace isn’t part of a pair of that kind – it’s just its own
thing.

David


#5

On Thu, 01 Dec 2005 11:33:36 -0000, Lionel T.
removed_email_address@domain.invalid wrote:

@my_hash["one"].sub!(/First/,'Modify')

@my_hash[“one”].replace ‘Modify’
is better

Definitely. Thanks. :slight_smile:

(P.s. is ‘replace’ one of the ‘!’ convention exceptions, or is there
another reason it doesn’t have a ‘!’ ?)


#6

On Thu, 01 Dec 2005 13:21:27 -0000, David A. Black removed_email_address@domain.invalid
wrote:

Ahh, I see… I had the idea that the bang signified a method that
modified self, regardless. A few other ‘exceptions’ make sense to me
now,
too :slight_smile:

Thanks David.