From: Orion Hunter Date: 2003-05-01T00:22:47+09:00 Subject: Arrays I am trying to create an array of certain length, with a default value of Array.new (such that I will have an array of arrays). I cannot use the "default" parameter setting Array.new( 4, Array.new ) because I end up with an array populated with references to the same array. For example: irb> a = Array.new( 4, Array.new ) irb> [ [], [], [], [] ] irb> a[0][0] = 1 irb> a irb> [ [1], [1], [1], [1] ] After some thought, this result was not surprising. The interpreter evaluates the Array.new parameter before passing, thus it ends up passing a reference, and this single reference gets populated into each element, instead of a new array into each. My next approach was to create the array, with a dafault length, and iterate over it assigning a new array to each element: my_arr = Array.new( 4 ) my_arr.each{ |i| i = Array.new } my_arr.each { |j| puts j.type } I get the following output: NilClass NilClass NilClass NilClass [nil, nil, nil, nil] I was finally able to achieve the desired result by using array.each_index: my_arr.each_index{ |m| my_arr[m] = Array.new } my_arr.each{ |n| puts n.type } Output: Array Array Array Array [ [], [], [], [] ] Conclusion: I understand why I can't pass Array.new as the default value in Array.new. However, I do _not_ understand why the first iterative approach does not work. I obviously know how to acquire the desired result, but that doesn't quench my curiousity as to why the other does not work. Can I bother someone for some enlightenment? Matt _________________________________________________________________ Protect your PC - get McAfee.com VirusScan Online http://clinic.mcafee.com/clinic/ibuy/campaign.asp?cid=3963