Ruby lets you define default values for hashes:
h=Hash.new(['alright'])
h['meh'] # => ["alright"]
Assignment of a value shows up when displaying the hash, but a modified default does not. Where's 'bad'
?
h['good']=['fine','dandy']
h['bad'].push('unhappy')
h # => {"good"=>["fine", "dandy"]}
'bad'
shows up if we explicitly ask.
h['bad'] # => ["alright", "unhappy"]
Why does the modified default value not show up when displaying the hash?
Hash's default value doesn't work like you're expecting it to. When you say h[k]
, the process goes like this:
k
key, return its value.Note that (2) and (3) say nothing at all about inserting k
into the Hash. The default value essentially turns h[k]
into this:
h.has_key?(k) ? h[k] : the_default_value
So simply accessing a non-existant key and getting the default value back won't add the missing key to the Hash.
Furthermore, anything of the form:
Hash.new([ ... ])
# or
Hash.new({ ... })
is almost always a mistake as you'll be sharing exactly the same default Array or Hash for for all default values. For example, if you do this:
h = Hash.new(['a'])
h[:k].push('b')
Then h[:i]
, h[:j]
, ... will all return ['a', 'b']
and that's rarely what you want.
I think you're looking for the block form of the default value:
h = Hash.new { |h, k| h[k] = [ 'alright' ] }
That will do two things:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With