Подтвердить что ты не робот

Создание массива Ruby, Array.new vs []

Какая разница между этими двумя утверждениями? Я использую их в приложении rails, и для меня это похоже на то, что они делают то же самое.

array_a = Array.new
array_b = []
4b9b3361

Ответ 1

Эти два утверждения функционально идентичны. 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]

Примечание: приведенные выше примеры взяты из Programming Ruby 1.9

Ответ 2

[] является ярлыком для метода Singleton класса Array [], который, в свою очередь, создает новый массив точно так же, как Array.new, поэтому вы, вероятно, можете сказать "они одинаковы", не беспокоясь слишком много.

Обратите внимание, что каждый вызов [] в irb создает новый массив:

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

От Код Ruby C:

rb_define_singleton_method(rb_cArray, "[]", rb_ary_s_create, -1);

Ответ 3

В принципе нет разницы

Ответ 4

Например, Hash.new vs {}. Они одинаковые. Включите скорость.

Ответ 5

Разницы нет, но...

Как другие уже ответили вам

Эти два утверждения функционально идентичны

Но есть рекомендации, чтобы ориентироваться, когда вы должны использовать каждый из них (чтобы ваш код было легче читать). Причина этого заключается в следующем:

Программы должны быть написаны для того, чтобы люди могли их читать, и только для машин - для выполнения.

из: https://github.com/rubocop-hq/ruby-style-guide#literal-array-hash

Предпочитайте литеральные массивы и нотации создания хэшей (если вам не нужно передавать параметры их конструкторам, то есть).

Поэтому, если вы создаете пустой массив, то [] - лучший вариант, но если вам нужно создать свой массив с набором из N nil объектов, вам следует написать Array.new(N).