[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Dynamically create hash

Matthias Wiemann

10/11/2007 10:58:00 AM

Hi,
i would like to dynamically create hashes, so that I can create them by
looping over the names.

Something like:

for i in 1..10
"hash#{i}" = Hash.new
"hash#{i}" = [:key => "val"]
end

So the hashes created would go by the names hash1, hash2, hash3...

Does anyone know how to do that?

thanks
mat
--
Posted via http://www.ruby-....

4 Answers

Sebastian Hungerecker

10/11/2007 11:07:00 AM

0

Matthias Wiemann wrote:
> Hi,
> i would like to dynamically create hashes, so that I can create them by
> looping over the names.

You can do that using eval (or using instance variables), but that's evil.
It would probably make more sense to use an array or hash of hashes.

> Something like:
>
> for i in 1..10
> "hash#{i}" = Hash.new
> "hash#{i}" = [:key => "val"]
> end
>
> So the hashes created would go by the names hash1, hash2, hash3...

hashes=Array.new(10) do |i|
{:key => "val"}
end

This gives you hashes[0] to hashes[9].


HTH,
Sebastian
--
NP: Black Sabbath - Heaven and Hell
Jabber: sepp2k@jabber.org
ICQ: 205544826

Joachim Glauche

10/11/2007 11:08:00 AM

0

I've no idea why you want this, but I think you want to have an array of
hashes to iterate through.

like this:

hashes = []
for i in 0..9
hashes[i] = {"key" => "val"}
end

so hashes contains
[{"key"=>"val"}, {"key"=>"val"}, {"key"=>"val"}, {"key"=>"val"},
{"key"=>"val"}, {"key"=>"val"}, {"key"=>"val"}, {"key"=>"val"},
{"key"=>"val"}, {"key"=>"val"}]


Matthias Wiemann wrote:
> Hi,
> i would like to dynamically create hashes, so that I can create them by
> looping over the names.
>
> Something like:
>
> for i in 1..10
> "hash#{i}" = Hash.new
> "hash#{i}" = [:key => "val"]
> end
>
> So the hashes created would go by the names hash1, hash2, hash3...
>
> Does anyone know how to do that?
>
> thanks
> mat

--
Posted via http://www.ruby-....

Matthias Wiemann

10/11/2007 11:20:00 AM

0

Thanks guys, that helped a lot.
--
Posted via http://www.ruby-....

Brian Adkins

10/11/2007 3:59:00 PM

0

On Oct 11, 6:57 am, Matthias Wiemann <matth...@wiemann.name> wrote:
> Hi,
> i would like to dynamically create hashes, so that I can create them by
> looping over the names.
>
> Something like:
>
> for i in 1..10
> "hash#{i}" = Hash.new
> "hash#{i}" = [:key => "val"]
> end
>
> So the hashes created would go by the names hash1, hash2, hash3...
>
> Does anyone know how to do that?

As other posters have mentioned, it's quite possible you don't want to
do that, but instead want an Array or Hash of Hashes to allow you to
more easily access the individual Hashes.

However, that's not as fun as exploring the possibilities :) You could
use Object#instance_variable_set, but then you'd have @hash1,
@hash2, ... instead of hash1, hash2, ...

Using Kernel#eval e.g. eval "hash1={:key=>value}; ... " won't work
because as of Ruby 1.8, you're required to define local variables in
the outer scope prior to executing eval which would defeat the
purpose.

However, I noticed Kernel#eval accepts a binding parameter, so the
following may do what you thought you wanted to do (but probably don't
actually want to do):

eval (1..10).inject("") {|m,o| m << "hash#{o}={:key =>
'value#{o}'};" }, binding

Brian Adkins

--
http://www...
http://loji...