Ruby - Разница между массивом # << и массивом # push
Изучая документацию для Ruby 1.9.3, как Array # < и Array # push были разработаны для реализации добавления элемента в конец текущего массива. Однако между ними, по-видимому, есть тонкие различия.
Я столкнулся с тем, что оператор * можно использовать для добавления содержимого всего другого массива к текущему, но только С#push.
a = [1,2,3]
b = [4,5,6]
a.push *b
=> [1,2,3,4,5,6]
Попытка использовать # < < вместо этого дает различные ошибки, в зависимости от того, используется ли он с оператором точки и/или круглыми скобками.
Почему # < < не работает так же #push? На самом деле это не псевдоним для другого?
Ответы
Ответ 1
Они очень похожи, но не идентичны.
<<
принимает единственный аргумент и помещает его в конец массива.
push
, с другой стороны, принимает один или несколько аргументов, вставляя их все в конец.
Тот факт, что <<
принимает только один объект, является причиной того, что вы видите ошибку.
Ответ 2
Причина, по которой <<
не работает, а push
- это:
-
push
может принимать множество аргументов (что происходит, когда вы делаете *b
).
-
<<
принимает только один аргумент.
Ответ 3
Основное различие между массивом # < < и Array # push
Array#<< # can be used to insert only single element in the Array
Array#push # can be used to insert more than single element in the Array
Другим существенным отличием является то,
В случае вставки одного элемента
Массив # < < быстрее, чем Array # push
Бенчмаркинг может помочь в определении производительности этих двух способов, найти более здесь.
Ответ 4
Еще один важный момент, который следует отметить здесь, заключается в том, что <<
также является оператором. И он имеет более низкий приоритет, чем некоторые операторы, такие как тернарный оператор. Это может привести к неожиданным результатам. например:
arr1, arr2 = [], []
arr1.push true ? 1 : 0
arr1
# => [1]
arr2 << true ? 1 : 0
arr2
# => [true]
Ответ 5
Метод push
добавляет элемент в конец массива. Он может иметь более одного аргумента.
<<
используется для инициализации массива и может иметь только один аргумент, добавляет элемент в конце массива, если он уже инициализирован.