Forums » Ruby » Point an element in Hash Object

Point an element in Hash Object
Posted by Andrew (Guest)
on 30.11.2005 23:05
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
Re: Point an element in Hash Object
Posted by lthiryidontwantspams (Guest)
on 01.12.2005 12:40
Ross Bamford 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 ;)
> 


--
Lionel Thiry

Personal web site: http://users.skynet.be/lthiry/
Re: Point an element in Hash Object
Posted by rosco (Guest)
on 01.12.2005 14:18
On Thu, 01 Dec 2005 11:33:36 -0000, Lionel Thiry
<lthiryidontwantspams@skynetnospam.be> wrote:

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

Definitely. Thanks. :)

(P.s. is 'replace' one of the '!' convention exceptions, or is there
another reason it doesn't have a '!' ?)
Re: Point an element in Hash Object
Posted by dblack (Guest)
on 01.12.2005 14:22
Hi --

On Thu, 1 Dec 2005, Ross Bamford 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
Re: Point an element in Hash Object
Posted by rosco (Guest)
on 01.12.2005 14:35
On Thu, 01 Dec 2005 13:21:27 -0000, David A. Black <dblack@wobblini.net>
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 :)

Thanks David.
Re: Point an element in Hash Object
Posted by rosco (Guest)
on 30.11.2005 23:44
On Wed, 30 Nov 2005 22:05:53 -0000, Andrew <andrea.reginato@gmail.com>
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 ;)