Ruby数组创建,Array.new vs []

Lan*_*Lan 33 ruby ruby-on-rails

这两个陈述有什么区别?我在我的rails应用程序中使用它们,对我而言看起来它们做同样的事情

array_a = Array.new
array_b = []
Run Code Online (Sandbox Code Playgroud)

zet*_*tic 69

这两个陈述在功能上是相同的.Array.new但是可以采取参数和块:

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]
Run Code Online (Sandbox Code Playgroud)

注意:以上示例取自Programming Ruby 1.9

  • +1因为你的答案比我的好:) (3认同)
  • 复制并粘贴获胜! (2认同)
  • `Array.new(count,object)`生成同一个对象的数组是一个问题,这意味着我避免使用这种方法. (2认同)

ste*_*tef 9

[]是Array类的单例方法的快捷方式,[]后者又以与创建新数组相同的方式创建一个新数组Array.new,所以你可以说"它们是相同的"而不用担心太多.

请注意,每次调用[]irb都会创建一个新数组:

>> [].object_id
=> 2148067340
>> [].object_id
=> 2149414040
Run Code Online (Sandbox Code Playgroud)

来自Ruby的C代码:

rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1);
Run Code Online (Sandbox Code Playgroud)