It is not a bug. Array.new(4, Array.new(4,false))
creates an array of 4 elements where each element is the same array object determined by a single call to Array.new(4, false)
. It does not execute Array.new(4,false)
4 times, once for each element of f
. So you end up with f
as an array of 4 references to the same object (a single 4-element array, [false, false, false, false]
).
If you want to have an array of 4 different 4-element arrays, there are many ways to do this in Ruby. One way is:
f = Array.new(4) { Array.new(4, false) }
This will execute Array.new(4, false)
separately for each entry in your Array.new(4)
.
2.4.0 :002 > f = Array.new(4) { Array.new(4, false) }
=> [[false, false, false, false], [false, false, false, false], [false, false, false, false], [false, false, false, false]]
2.4.0 :003 > f.each do |array|
2.4.0 :004 > p array.inspect
2.4.0 :005?> end
"[false, false, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
=> [[false, false, false, false], [false, false, false, false], [false, false, false, false], [false, false, false, false]]
2.4.0 :006 > f[1][1] = true
=> true
2.4.0 :007 > p "after setting f[1][1]"
"after setting f[1][1]"
=> "after setting f[1][1]"
2.4.0 :008 > f.each do |array|
2.4.0 :009 > p array.inspect
2.4.0 :010?> end
"[false, false, false, false]"
"[false, true, false, false]"
"[false, false, false, false]"
"[false, false, false, false]"
=> [[false, false, false, false], [false, true, false, false], [false, false, false, false], [false, false, false, false]]
2.4.0 :011 >
For reference, see the Ruby documentation for Creating Arrays.