OK, recently a cool feature has been added to ruby to start assigning
immediately to a hash of hashes, hash of arrays, etc. as follows:

x = Hash.new{|a,b| a[b] = Hash.new}
y = Hash.new{|a,b| a[b] = Array.new}

x['a']['b'] = 'hello' # -> {"a"=>{"b"=>"hello"}}
y['a'][3] = 100 # -> {"a"=>[nil, nil, nil, 100]}

However, this is not possible for arrays, so we cannot do the
following for arrays of hashes or arrays of arrays:

x = Array.new{|a,b| a[b] = Hash.new}
y = Array.new{|a,b| a[b] = Array.new}

I'm hoping this is just an oversight, because it would be useful.
Comments?

Another oddity is one that I think has been around for a while, but I
haven't seen it discussed before (correct me if I'm wrong -- I'm new
to ruby). It's the infamous local variable scope issue. In the
discussions I've read, methods are supposed to define a scope for
local variables. Blocks within methods also have their own scope, if
the variables have not been used already. BUT control structures like
if-else, for, while, etc. are NOT supposed to define their own scope.
How, then, to explain this example?

i = 0
while i < 10
	puts x if defined? x
	x = 10
	i += 1
end

Nothing is outputted. The value of x is indeed local to the while
loop; it becomes undefined again each time the loop restarts. On the
other hand, if x is first defined outside the loop, this does not
occur. I thought a while loop was supposed to act differently from a
block?

Please enlighten me,
Dave