I can answer the second part, but would have to this a bit about the first:
I was doing some practice and play with Hash default value as written in
the documentation.
h = Hash.new()
h[:a] << 2
h[:a] << 3
h[:a] # => [2, 3]
Till above is perfect.
h # => {}
Why the Hash h is empty hash here?
h[:b] << 2
h[:b] # => [2, 3, 2]
How h[:b] is `[2, 3, 2]` instead of only `[2]` ?
Object references.
Try it like this:
ary =
hsh = Hash.new(ary)
hsh[:x] #=>
ary << 1
hsh[:x] #=> [1]
Every "default" element of `hsh` contains a reference to the `ary`
object. Similarly, in your original example, every default element of
`h` contained a reference to the unnamed array object.
At a _guess_ as to the first part:
h = Hash.new()
# 1. you create an unnamed array object
# 2. you create a hash object, whose "default value" is a reference to
that array object
h[:a] << 2
# 3. h has no key :a, so `h[:a]` returns the default object (the
unnamed array) above
# 4. you call `<< 2` on that default object; so the unnamed array now
has one element
h[:a] << 3
# 5. (as above, now it has two elements)
h[:a] # => [2, 3]
# 6. h still has no key :a, so `h[:a]` returns the default object (the
unnamed array) above, which has the two elements you assigned it
h # => {}
# 7. at no point above did you *add* an element to h; all you did is
*get* an element (which didn't exist, so you always got the default),
so h remains empty
h[:b] << 2
# 8. like above: h has no key :b, so `h[:b]` returns the default object
# 9. you call `<< 2` on that object, so now it has 3 elements
h[:b] # => [2, 3, 2]
# 10. h still has no key :b, so `h[:b]` returns the default object,
which is an array with 3 elements
···
On 23 June 2013 16:17, Love U Ruby <lists@ruby-forum.com> wrote:
--
Matthew Kerwin, B.Sc (CompSci) (Hons)
http://matthew.kerwin.net.au/