[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Some help needed with understanding ruby hashes

Frank Church

6/26/2007 1:04:00 AM


If a ruby hash rubyhash has a key such as "hashkey" is there a way of
retrieving the value by the expression rubyhash["hashkey"] ?

It only seems logical that is rubyhash.has_key?("hashkey") returns true
rubyhash["hashkey"] should return a value, but it always gives an error.

I know the same can be achieved via with rubyhash.values_at("hashkey")
but it appears so inelegant to me.

I am trying to create an erb template which will use the hash keys here
such as directory1 directory2 for each directory and the for each
directory use hash key s such as directory, archivename etc, but I find
values_at rather inelegant.

I sorely hope there is some aspect to ruby hashes syntax that I am
missing.

directories :
directory1 :
directory : /thisdirectory/yada/yada/yada
archivename : archivename01
updatemode : updatemode01
encryptkey : encryptkey01
configdir : configdir01
workdir : workingdir01
storagedir : storagedir01
logsdir : logsdir01

directory2 :
directory : /thisdirectory/yada2/yada2/yada2
archivename : archivename02
updatemode : updatemode02
encryptkey : encryptkey02
configdir : configdir02
workdir : workingdir02
storagedir : storagedir02
logsdir : logsdir02

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

7 Answers

Harry Kakueki

6/26/2007 2:03:00 AM

0

On 6/26/07, Frank Church <vfcforums@gmail.com> wrote:
>
> If a ruby hash rubyhash has a key such as "hashkey" is there a way of
> retrieving the value by the expression rubyhash["hashkey"] ?
>
> It only seems logical that is rubyhash.has_key?("hashkey") returns true
> rubyhash["hashkey"] should return a value, but it always gives an error.
>

This gives you an error?

rubyhash = {"hashkey"=>"hashvalue"}
p rubyhash["hashkey"]


Harry

--
A Look into Japanese Ruby List in English
http://www.ka...

James Gray

6/26/2007 2:12:00 AM

0

On Jun 25, 2007, at 8:04 PM, Frank Church wrote:

>
> If a ruby hash rubyhash has a key such as "hashkey" is there a way of
> retrieving the value by the expression rubyhash["hashkey"] ?
>
> It only seems logical that is rubyhash.has_key?("hashkey") returns
> true
> rubyhash["hashkey"] should return a value, but it always gives an
> error.

What you described is the standard Ruby behavior:

$ irb
>> hash = Hash.new
=> {}
>> hash["some_key"]
=> nil
>> hash["some_key"] = "I'm set now!"
=> "I'm set now!"
>> hash.has_key? "some_key"
=> true
>> hash["some_key"]
=> "I'm set now!"

Note how I tried that out in the irb shell. It lets you enter Ruby
expressions and examine their output. This is a powerful ally when
learning the rules of Ruby.

In short, something else is going on in your code. Hashes work as
you expect.

James Edward Gray II


Morton Goldberg

6/26/2007 2:32:00 AM

0

On Jun 25, 2007, at 9:04 PM, Frank Church wrote:

>
> If a ruby hash rubyhash has a key such as "hashkey" is there a way of
> retrieving the value by the expression rubyhash["hashkey"] ?
>
> It only seems logical that is rubyhash.has_key?("hashkey") returns
> true
> rubyhash["hashkey"] should return a value, but it always gives an
> error.
>
> I know the same can be achieved via with rubyhash.values_at("hashkey")
> but it appears so inelegant to me.

What you say you are doing works for me.

rubyhash = { "hashkey" => "value"}
rubyhash["hashkey"] # => "value"

I can only conclude that your problem is really other than what you
think it is. I think you would be well advised to post the actual
code that is producing the error.

Regards, Morton

Frank Church

6/26/2007 9:27:00 AM

0

Frank Church wrote:
>
> If a ruby hash rubyhash has a key such as "hashkey" is there a way of
> retrieving the value by the expression rubyhash["hashkey"] ?
>
> It only seems logical that is rubyhash.has_key?("hashkey") returns true
> rubyhash["hashkey"] should return a value, but it always gives an error.
>
> I know the same can be achieved via with rubyhash.values_at("hashkey")
> but it appears so inelegant to me.
>
> I am trying to create an erb template which will use the hash keys here
> such as directory1 directory2 for each directory and the for each
> directory use hash key s such as directory, archivename etc, but I find
> values_at rather inelegant.
>
> I sorely hope there is some aspect to ruby hashes syntax that I am
> missing.
>

I tracked the error, I was testing the using the concatenating strings
without using to_s in the code. ie.

puts "hashkey value is " + rubyhash["hashkey"]

instead of

"hashkey value is " + (rubyhash["hashkey"]).to_s

Regards

Frank

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

Morton Goldberg

6/26/2007 10:55:00 AM

0

On Jun 26, 2007, at 5:27 AM, Frank Church wrote:

> I tracked the error, I was testing the using the concatenating strings
> without using to_s in the code. ie.
>
> puts "hashkey value is " + rubyhash["hashkey"]
>
> instead of
>
> "hashkey value is " + (rubyhash["hashkey"]).to_s

You could have saved yourself a lot trouble by using

puts "hashkey value is #{rubyhash["hashkey"]}"

Regards, Morton

Frank Church

6/26/2007 11:45:00 AM

0

Morton Goldberg wrote:
> On Jun 26, 2007, at 5:27 AM, Frank Church wrote:
>
>> I tracked the error, I was testing the using the concatenating strings
>> without using to_s in the code. ie.
>>
>> puts "hashkey value is " + rubyhash["hashkey"]
>>
>> instead of
>>
>> "hashkey value is " + (rubyhash["hashkey"]).to_s
>
> You could have saved yourself a lot trouble by using
>
> puts "hashkey value is #{rubyhash["hashkey"]}"
>
> Regards, Morton

I am learning Ruby step by step. There appear to be so many different
ways of achieving the same thing, coming from a more procedural
background, there are quite a number of things about the Ruby way I have
to learn.

As you can see from here
http://forums.devshed.com/ruby-programming-142/erb-undefined-local-variable-or-method-4...

I have an even more troublesome question I can't locate. I will post it
when I find it.


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

Morton Goldberg

6/26/2007 4:50:00 PM

0

On Jun 26, 2007, at 7:45 AM, Frank Church wrote:

> Morton Goldberg wrote:
>> You could have saved yourself a lot trouble by using
>>
>> puts "hashkey value is #{rubyhash["hashkey"]}"
>>
>> Regards, Morton
>
> I am learning Ruby step by step. There appear to be so many different
> ways of achieving the same thing, coming from a more procedural
> background, there are quite a number of things about the Ruby way I
> have
> to learn.

The point to note about 'puts "hashkey value is #{rubyhash
["hashkey"]}"' is that the interpreter calls to_s on the result of a #
{...} evaluation, but String#+ is picky about is argument -- the
argument must be a string. That means, as you have found out, that
you must explicitly coerce anything not a string with to_s before
passing it to String#+.

Regards, Morton