From: Robert Klemme Date: 2011-12-12T21:05:27+09:00 Subject: Re: How to create Arrays (and Hashes) correctly? On Mon, Dec 12, 2011 at 11:31 AM, Janko Muzykant wrote: > As far as I know, I can create Arrays and Hashes in Ruby at least in two > ways, either by: > >        a = [] > or by: >        a = Array.new > > I'm coming from JavaScript world and in JS the first form is prefered over > the second one. Is there any difference in Arrays (and Hashes) created in > Ruby by [] (and {} respectively) and Array.new (Hash.new) ? No, if you only consider constructor without arguments. But constructors with arguments provide additional features (see documentation). > I tried to answer myself searching in google and the only conclusion I > found is that, when creating arrays with elements, one should use: > >        a = ["Ala", "ma", "kota"] For strings you can even do this if they do not contain whitespace: a = %w{Ala ma kota} a = %w[Ala ma kota] a = %w(Ala ma kota) a = %w etc. > but on the other hand, for empty array with element added dynamically > later, following form is more accurate: > >        a = Array.new   # not a = [] >        a.push(...) > > Is that right, or have I misunderstood something here? I prefer to use [] over Array.new and {} over Hash.new as it is less typing and visually more obvious. I only resort to Array.new and Hash.new if I need functionality with the constructor, e.g. irb(main):003:0> a = Array.new 5, 0 => [0, 0, 0, 0, 0] irb(main):004:0> a = Array.new(5) {|i| "dat #{i}"} => ["dat 0", "dat 1", "dat 2", "dat 3", "dat 4"] and for Hash irb(main):005:0> h = Hash.new 0 => {} irb(main):006:0> h[:x] += 1 => 1 irb(main):007:0> h => {:x=>1} as well as irb(main):008:0> h = Hash.new {|ha,k| ha[k] = []} => {} irb(main):009:0> h[:y] << "foo" => ["foo"] irb(main):010:0> h[:y] << "bar" => ["foo", "bar"] irb(main):011:0> h[:x] << 123 => [123] irb(main):012:0> h => {:y=>["foo", "bar"], :x=>[123]} Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/