From: "David A. Black" Date: 2008-05-02T21:24:05+09:00 Subject: Re: Beginner Question on Ruby Hi -- On Fri, 2 May 2008, Arun Kumar wrote: > On Fri, May 2, 2008 at 5:27 PM, David A. Black wrote: > >> Hi -- >> >> >> On Fri, 2 May 2008, Arun Kumar wrote: >> >> Hi all, >>> >>> I am beginning to learn ruby and cant seem to reason this behaviour. I >>> expect since empty or nill is the array, arr*n shouldnt change it. >>> >>> Why is this behaviour so? >>> >>> Code: >>> >>> num_arr = Array.new >>> puts "Num Alpha: #{num_arr} and size: #{num_arr.size}" >>> puts "Num Alpha: #{num_arr << num_arr} and size: #{num_arr.size}" >>> num_arr.insert(-1, num_arr << num_arr) >>> puts "Num Alpha: #{num_arr} and size: #{num_arr.size}" >>> >>> Output: >>> >>> Num Alpha: and size: 0 >>> Num Alpha: [...] and size: 1 >>> Num Alpha: [...][...][...][...][...][...][...][...][...] and size: 3 >>> >> >> You're inserting an array into itself. Ruby represents that kind of >> recursive inclusion with dots. >> >> irb(main):005:0> a = [] >> => [] >> irb(main):006:0> a << a >> => [[...]] >> > Hello David, > > Thanks for the answer. > > But would you know why it is so? Is there something syntactic or semantic > issue that I am making, > > the reason i ask this is... > > n = 10 > x += n > does a perfect x = nil + n => n initialization, which is good and > explainable. You can't add 10 to nil. You'll get an error if you try to do that, because nil has no + method. > In the array case however, > One would expect [atleast i am :) ] the elements of the source array [if > any] be appended to the target. Now why is the reference going in making it > a recursive :? > > sorry if this question is lame or bozo but i feel a clear behaviour enables > clear understanding or would require even more clearer reasoning. You've using the << method: num_arr = Array.new num_arr << num_arr which appends the object num_arr (not its elements, but it, itself) to the object num_arr. If you want to add the elements of an array to another array, you can use concat: irb(main):001:0> a = [1,2,3] => [1, 2, 3] irb(main):002:0> a.concat(a) => [1, 2, 3, 1, 2, 3] It's all perfectly reasonable -- you just have to know what the methods you're using actually do :-) David -- Rails training from David A. Black and Ruby Power and Light: INTRO TO RAILS June 9-12 Berlin ADVANCING WITH RAILS June 16-19 Berlin INTRO TO RAILS June 24-27 London (Skills Matter) See http://www.rubypal.com for details and updates!