2011-01-05 12 views
25

Jaka jest różnica między tymi dwoma stwierdzeniami? Używam ich w moim app szyn i dla mnie to wygląda jak robią to samoTworzenie macierzy Ruby, Array.new kontra []

array_a = Array.new 
array_b = [] 
+1

aby usunąć/reset tablicę bez tworzenia nowego obiektu, użyj 'array.clear' aby osiągnąć '# => []' –

Odpowiedz

56

Te dwa stwierdzenia są funkcjonalnie identyczne. Array.new jednak można wziąć argumenty i blok:

Array.new # => [] 
Array.new(2) # => [nil,nil] 
Array.new(5,"A") # =>["A","A","A","A","A"] 

a = Array.new(2,Hash.new) 
a[0]['cat'] = 'feline' 
a # => [{"cat"=>"feline"},{"cat"=>"feline"}] 
a[1]['cat'] = 'Felix' 
a # => [{"cat"=>"Felix"},{"cat"=>"Felix"}] 

a = Array.new(2){Hash.new} # Multiple instances 
a[0]['cat'] = 'feline' 
a # =>[{"cat"=>"feline"},{}] 
squares = Array.new(5){|i|i*i} 
squares # => [0,1,4,9,16] 

copy = Array.new(squares) # initialized by copying 
squares[5] = 25 
squares # => [0,1,4,9,16,25] 
copy # => [0,1,4,9,16] 

Uwaga: Powyższe przykłady zaczerpnięte z Programming Ruby 1.9

+2

+1, ponieważ twoja odpowiedź jest lepsza niż moja :) – sethvargo

+2

skopiuj i wklej dla wygranej! – zetetic

+2

'Array.new (count, object)' wytwarzanie tablicy tego samego obiektu to getcha, co oznacza, że ​​unikam stosowania tego podejścia. –

9

[] jest skrótem do metody singleton klasy Array [] co z kolei tworzy nową tablicę w taki sam sposób jako Array.new, więc możesz powiedzieć "są tacy sami", nie martwiąc się zbytnio.

Należy pamiętać, że każde wywołanie [] w IRB tworzy nową tablicę:

>> [].object_id 
=> 2148067340 
>> [].object_id 
=> 2149414040 

Od Ruby's C code:

rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1); 
Powiązane problemy