From: gotoken@... (GOTO Kentaro) Date: 2001-03-06T23:25:13+09:00 Subject: [ruby-talk:12136] Re: Weird Array behavior In message "[ruby-talk:12130] Weird Array behavior" on 01/03/06, jjthrash@pobox.com writes: >array = [[12345, "val"],[23456, "val2"],[34567, "val3"],[45678,"val4"]] >oldArray = array >array = Array.new((oldArray.size.to_f/3).ceil, Array.new(2)) >oldArray.each_with_index do |entry, index| > if array[(index.to_f/3).floor][0] == nil > array[(index.to_f/3).floor][0] = entry[0] > #INSPECTION POINT >If I debug and step up to the first time I reach the INSPECTION >POINT, I expect the value array to be >[[12345, nil], [nil, nil]], but it's actually >[[12345, nil], [12345, nil]] Array.new fills always with an *identical* object, specified as the 2nd argument. So we have to fill *after* create an array. Each of the following create empty an array consists of empty arrays: #1 straightforward array = [] (oldArray.size.to_f/3).ceil.times{ array.push Array.new(2) } #2 intuitive array = Array.new((oldArray.size.to_f/3).ceil).map{Array.new(2)} #3 faster than the above (array = Array.new((oldArray.size.to_f/3).ceil)).map!{Array.new(2)} -- Gotoken