[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Creating hashes with duplicate keys

Sy Ali

7/28/2006 8:39:00 AM

I want to simplify this hash creation:
g = { 1 => "test", 2 => "test", }

I have a particularly complicated hash that I'm generating. It can
have very large values.

Right now, I duplicate values with something like this:

c = { 1 => "one", }
d = { 2 => c[1], }
c.merge!(d)

however, I don't like the way my code looks.. I want to be able to
specify the duplication within the hash generation.

Is this possible?

5 Answers

Farrel Lifson

7/28/2006 8:49:00 AM

0

On 28/07/06, Sy Ali <sy1234@gmail.com> wrote:
> I want to simplify this hash creation:
> g = { 1 => "test", 2 => "test", }
>
> I have a particularly complicated hash that I'm generating. It can
> have very large values.
>
> Right now, I duplicate values with something like this:
>
> c = { 1 => "one", }
> d = { 2 => c[1], }
> c.merge!(d)
>
> however, I don't like the way my code looks.. I want to be able to
> specify the duplication within the hash generation.
>
> Is this possible?

Something like this?
irb(main):001:0> c={}
=> {}
irb(main):002:0> c[1] = "one"
=> "one"
irb(main):003:0> c[2] = c[1]
=> "one"
irb(main):004:0> c[1].object_id == c[2].object_id
=> true

Farrel

Daniel Schierbeck

7/28/2006 9:30:00 AM

0

Sy Ali wrote:
> I want to simplify this hash creation:
> g = { 1 => "test", 2 => "test", }
>
> I have a particularly complicated hash that I'm generating. It can
> have very large values.
>
> Right now, I duplicate values with something like this:
>
> c = { 1 => "one", }
> d = { 2 => c[1], }
> c.merge!(d)
>
> however, I don't like the way my code looks.. I want to be able to
> specify the duplication within the hash generation.
>
> Is this possible?

This will work:

hsh = Hash.new{|h, k| h[k] = (k == 1 ? "one" : h[k - 1])}

Note that all the values will be the same -- the same object! If you
want duplicates, do this instead:

hsh = Hash.new{|h, k| h[k] = (k == 1 ? "one" : h[k - 1].dup)}

Just ask if there are parts of the snippet you don't understand.


Cheers,
Daniel

Peña, Botp

7/28/2006 9:39:00 AM

0

fr Sy:
# I want to simplify this hash creation:
# g = { 1 => "test", 2 => "test", }
# ...
# however, I don't like the way my code looks.. I want to be able to
# specify the duplication within the hash generation.

not sure if this simple idea will help, but,

irb(main):055:0> class Hash
irb(main):056:1> def init2 range
irb(main):057:2> range.each{|c| self[c]=self.default}
irb(main):058:2> end
irb(main):059:1> end
=> nil
irb(main):060:0> h=Hash.new
=> {}
irb(main):065:0> h.default = "test"
=> "test"
irb(main):066:0> h.init2 1..8
=> 1..8
irb(main):067:0> h
=> {5=>"test", 6=>"test", 1=>"test", 7=>"test", 2=>"test", 8=>"test", 3=>"test", 4=>"test"}
irb(main):068:0> h.default = "testing again"
=> "testing again"
irb(main):069:0> h.init2 6..10
=> 6..10
irb(main):070:0> h
=> {5=>"test", 6=>"testing again", 1=>"test", 7=>"testing again", 2=>"test", 8=>"testing again", 3=>"test", 9=>"testing again", 4=>"test", 10=>"testing again"}
irb(main):071:0>

kind regards -botp

Ara.T.Howard

7/28/2006 2:07:00 PM

0

Ara.T.Howard

7/28/2006 2:33:00 PM

0