From: Robert Klemme Date: 2004-05-11T20:43:59+09:00 Subject: Re: [Q] Array.new - strange behavior "E.-R. Bruecklmeier" schrieb im Newsbeitrag news:c7q5it$jc5$1@news.BelWue.DE... > dear rubyists, > > today i noticed a strange bahavior in Array.new while defining multi > dimentional arrays: > > p "P1" > foo = Array.new(3,[0,0]) > foo.each do |foo1| > p foo1.id > end > > p "P2" > foo = Array.new > 3.times {foo.push [0,0]} > foo.each do |foo1| > p foo1.id > end > > > produces: > > "P1" > 19645868 > 19645868 > 19645868 > "P2" > 19645760 > 19645748 > 19645736 > Completed(0) > > Is it intentional that the new method fills the array with just one > instance of [0,0]? In my sense this is a violation of the PoLS. Well, I'd say no, if you aware of how Ruby deals with instances and variables. All variables hold references - there is no distinction between pass by value and pass by reference as it is in C++. Then you'll see that a single instance is handed over to the constructor in your first example. That instance is used for each array element, which is fine for immutable classes (integers for example). If you need different instances, you'll need the block form as shown by you or even better the other one: foo = Array.new( 3 ) {[0,0]} irb(main):002:0> foo = Array.new( 3 ) {[0,0]} => [[0, 0], [0, 0], [0, 0]] irb(main):003:0> foo.each {|o| puts o.id} 135011840 135011828 135011816 => [[0, 0], [0, 0], [0, 0]] Regards robert