Hi Ive done a search on this and there have been quite a few posts which
have incresed my knowlege somewhat but still have a few questions.
Im creating a hash of arrays. The keys and values are added within a
loop. For each key there may be multiple values hence the need for an
array as a value. Values for a key are found over interations of a loop.
I therefore have to append a new found value to the existing values in
an array.
I tried doing this
something.each do |blah|
if (test something)
hash[key] = hash[key] + value
end
end
but the compliler complains about there being no method for nil class.
but as im in a loop that would require me to do a check to see if the
key exists or not. If im processing lots of informatino that would slow
me down a bit.
but as im in a loop that would require me to do a check to see if the
key exists or not. If im processing lots of informatino that would slow
me down a bit.
IS there a slicker way of doing this?
The most common idiom is:
(hash[key] ||= []) << value
You can also make a hash that has a default behavior, for non-existent
keys, of putting an array at that key:
Thanks for the reply. Can I ask what these || mean…in this case do they
mean OR???
Yes. This:
a ||= b
is the same as:
a or a = b
I used to describe it like this:
a = a || b
but there are some edge cases where that doesn’t apply (having to do
with hash defaults, actually, but you don’t need to worry about it in
this case). Matz clarified it with the “or” version at RubyConf last
year.
does anyone have any good links on using the use of arrays with hashes
in this manner?