On Wed, Jan 18, 2012 at 10:46 AM, Emil Enem=E6rke <eme / medical-insight.com>=
 wrote:
> Hi,
>
> On 16 Jan, 2012, at 16:19 , Robert Klemme wrote:
>
>> On Mon, Jan 16, 2012 at 3:17 PM, Emil Enem=E6rke <eme / medical-insight.co=
m> 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=3Dserver1
>>> server =3D Hash.new { |hash, key| hash[key] =3D [] }
>>> service_name=3D"service name"
>>> service=3Dservice1
>>>
>>> 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 =3D Hash.new { |hash, key| hash[key] =3D [] }
=3D> {}
irb(main):002:0> key =3D "foo"
=3D> "foo"
irb(main):003:0> server.key? key
=3D> false
irb(main):004:0> server
=3D> {}
irb(main):005:0> server[key]
=3D> []
irb(main):006:0> server
=3D> {"foo"=3D>[]}
irb(main):007:0> server.key? key
=3D> 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.

>>> =A0 =A0 =A0server[hostname]=3DHash.new { |hash, key| hash[key] =3D [] }
>>> =A0 =A0 =A0server[hostname]["service_name"]=3DArray.new
>>> =A0 =A0 =A0server[hostname]["service_name"]=3D"service#{service_counter=
}"
>>> =A0 =A0 =A0server[hostname]["service_name"]=3D[x,x,x]
>>
>> The three lines above all overwrite the same entry. =A0That's almost
>> certainly not what you want.
>>
>>> end
>>> -----------------
>>>
>>> I have tried with
>>> $server[hostname]["service_name"]=3D[x,x,x]
>>> $server[hostname]["service_name"]=3DArray.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 =3D Hash.new { |hash, key| hash[key] =3D {} }
>> server[hostname]["service_name"] =3D ["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 n=
ot being global. So how can I make the
> server[hostname]["service_name"] =3D ["service#{service_counter}", [x,x,x=
]]
> a global variable?

Prepend $.

Regards

robert


--=20
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/