From: Robert Klemme Date: 2012-01-18T19:31:08+09:00 Subject: Re: global array On Wed, Jan 18, 2012 at 10:46 AM, Emil Enemærke wrote: > Hi, > > On 16 Jan, 2012, at 16:19 , Robert Klemme wrote: > >> On Mon, Jan 16, 2012 at 3:17 PM, Emil Enemærke wrote: >>> Hi, >>> >>> Im trying to make an array a global array, but I cannot make it work. >> >> "server" references a Hash. >> >>> Here is what I have: >>> ------------ >>> hostname=server1 >>> server = Hash.new { |hash, key| hash[key] = [] } >>> service_name="service name" >>> service=service1 >>> >>> if server.key?(hostname) >> >> Will likely return false because the Hash is empty initially. > That was the intention, if the hash is empty create it. But this won't work as intended: you create the Hash stored in "server" with a block which creates Arrays internally. For that mechanism to work you just access server[some_key] and work with what you get. If you ask whether the key exists you always get false: irb(main):001:0> server = Hash.new { |hash, key| hash[key] = [] } => {} irb(main):002:0> key = "foo" => "foo" irb(main):003:0> server.key? key => false irb(main):004:0> server => {} irb(main):005:0> server[key] => [] irb(main):006:0> server => {"foo"=>[]} irb(main):007:0> server.key? key => true And if you ask for the key then you need to take action if it is NOT there but your code assigns only to server[hostname] if server.key? hostname returned true. You need to at leas negate the condition. >>>      server[hostname]=Hash.new { |hash, key| hash[key] = [] } >>>      server[hostname]["service_name"]=Array.new >>>      server[hostname]["service_name"]="service#{service_counter}" >>>      server[hostname]["service_name"]=[x,x,x] >> >> The three lines above all overwrite the same entry.  That's almost >> certainly not what you want. >> >>> end >>> ----------------- >>> >>> I have tried with >>> $server[hostname]["service_name"]=[x,x,x] >>> $server[hostname]["service_name"]=Array.new >>> >>> but that does not work... Any help is appreciated. >> >> I am not 100% sure what you intend but I think you might just want >> >> server = Hash.new { |hash, key| hash[key] = {} } >> server[hostname]["service_name"] = ["service#{service_counter}", [x,x,x]] >> > That is a much more elegant solution than mine, thanks. > > But this does not solve my problem, I have the hash created within a loop but are not able to access to array from outside that loop, due the hash not being global. So how can I make the > server[hostname]["service_name"] = ["service#{service_counter}", [x,x,x]] > a global variable? Prepend $. Regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/