Как только вы узнаете, что shift/unshiftони похожи push/popна другой конец массива, вы можете мысленно отбросить букву «f» из имени методов, чтобы запомнить, какой из них «выгружает» элементы, а какой «вставляет» их. :)
Phrogz
1
Спасибо, что действительно помогает, lol.
agentbanks217
Один из лучших комментариев! Спасибо вам большое :)
tvdeyen 06
18
@Phrogz На самом деле пищеварительные системы позвоночных лучше моделировать как очереди, чем как стеки.
Цзянь
8
@Jian :) Правильно: pushон наверху, а shiftна другом конце.
По сути, вы можете думать о shift и unshift как об операциях с очередью FIFO,
Жако Преториус,
@JacoPretorius А? shiftи unshiftдействовать как стек FILO, pushи shiftбудет действовать как очередь FIFO, если я в чем-то не запутался.
Грег Шмит
@GregSchmit Ах, ты прав. Или вообще очередь LIFO, верно?
Жако Преториус
@JacoPretorius Ну, я думаю, что LIFO == FILO (первый за последним подразумевает, что последний должен выйти первым, если шаблон верен).
Грег Шмит
@JacoPretorius И LIFO, и FILO означают «вести себя как стек».
Грег Шмит
52
shiftи unshiftдействует аналогично popи push: они предназначены для использования массивов в качестве стеков, в которые вы можете добавлять и удалять элементы (обычно по одному за раз). Разница только в том, что shiftи unshiftдобавление / удаление элементов в начале Array, фактически смещение всех других элементов, popи pushдобавление / удаление элементов в конце Array, с сохранением индексов других элементов.
Примеры:
# Spacing for clarity:
a = [2, 4, 8] # a => [2, 4, 8]
a.push(16, 32) # a => [2, 4, 8, 16, 32]
a.unshift(0, 1) # a => [0, 1, 2, 4, 8, 16, 32]
a.shift # a => [1, 2, 4, 8, 16, 32]
a.pop # a => [1, 2, 4, 8, 16]
Если бы вы отредактировали свой ответ, чтобы резюмировать ветку mipadi, я был бы рад проголосовать за.
Стивен Судит,
Круто. Кроме того, я не очень хорошо разбираюсь в Ruby, но если он работает на JVM, я ожидаю, что push / pop будет быстрее, поскольку ему не нужно перемещать все эти элементы.
Стивен Судит,
Проголосуйте за аналогию со стеком, но подумайте и о трубах. Поскольку мы должны быть программистами, мы также должны думать, что shift - это сдвиг влево, а unshift - это сдвиг вправо в горизонтальном массиве слева направо.
mckenzm
8
Он захватывает первый элемент, удаляет его из массива и возвращает удаленный элемент. По сути, это способ рассматривать массив как стек: shiftэто pop, unshiftis push.
Ну, shift и unshift похожи на pop и push, за исключением того, что они добавляют и удаляют элементы с начала массива, а не с конца.
Альберто Сантини,
2
Этот ответ находится на правильном уровне абстракции.
Стивен Судит,
@Alberto: Или, другими словами, они считают, что фронт - это вершина. Иного не требуется.
Стивен Судит,
5
Я просто указал на то, что, поскольку popи pushтакже являются Arrayметодом, путаницы не должно быть. :-)
Альберто Сантини
3
@Alberto: Это действительно хороший момент. Методы shift / unshift используют переднюю часть как верхнюю, а методы push / pop используют конец как верх. Оба они рассматривают массив как стек, различающиеся только концом, который они используют.
Стивен Судит,
2
Если вы можете думать о массиве как о очереди значений, которые должны быть обработаны, тогда вы можете взять следующее (переднее) значение и «сместить» другое значение, чтобы занять доступное пространство. unshift возвращает значения - возможно, вы не готовы обрабатывать некоторые из них или позволите более позднему коду обработать их.
shift/unshift
они похожиpush/pop
на другой конец массива, вы можете мысленно отбросить букву «f» из имени методов, чтобы запомнить, какой из них «выгружает» элементы, а какой «вставляет» их. :)push
он наверху, аshift
на другом конце.Ответы:
Просмотр документации Ruby
Array.shift удаляет первый элемент из массива и возвращает его
a = [1,2,3] puts a.shift => 1 puts a => [2, 3]
Unshift добавляет указанное значение в начало массива, перемещая все остальные элементы на один вверх
a=%w[b c d] => ["b", "c", "d"] a.unshift("a") => ["a", "b", "c", "d"]
источник
shift
иunshift
действовать как стек FILO,push
иshift
будет действовать как очередь FIFO, если я в чем-то не запутался.shift
иunshift
действует аналогичноpop
иpush
: они предназначены для использования массивов в качестве стеков, в которые вы можете добавлять и удалять элементы (обычно по одному за раз). Разница только в том, чтоshift
иunshift
добавление / удаление элементов в началеArray
, фактически смещение всех других элементов,pop
иpush
добавление / удаление элементов в концеArray
, с сохранением индексов других элементов.Примеры:
# Spacing for clarity: a = [2, 4, 8] # a => [2, 4, 8] a.push(16, 32) # a => [2, 4, 8, 16, 32] a.unshift(0, 1) # a => [0, 1, 2, 4, 8, 16, 32] a.shift # a => [1, 2, 4, 8, 16, 32] a.pop # a => [1, 2, 4, 8, 16]
источник
Он захватывает первый элемент, удаляет его из массива и возвращает удаленный элемент. По сути, это способ рассматривать массив как стек:
shift
это pop,unshift
is push.источник
pop
иpush
также являютсяArray
методом, путаницы не должно быть. :-)Если вы можете думать о массиве как о очереди значений, которые должны быть обработаны, тогда вы можете взять следующее (переднее) значение и «сместить» другое значение, чтобы занять доступное пространство. unshift возвращает значения - возможно, вы не готовы обрабатывать некоторые из них или позволите более позднему коду обработать их.
источник
Он возвращает первый элемент массива и удаляет его из массива, сдвигая элементы назад на одно место.
Так что сдвиг
[1,2,3,4,5]
возвращает
1
и устанавливает массив равным[2,3,4,5]
.Подробнее здесь .
источник