Что делает Ruby's Array # shift?

88

Мне трудно понять, что делают методы shift и unshift класса Array в Ruby. Может кто-нибудь помочь мне понять, что они делают?

агентбанки217
источник
171
Как только вы узнаете, что shift/unshiftони похожи push/popна другой конец массива, вы можете мысленно отбросить букву «f» из имени методов, чтобы запомнить, какой из них «выгружает» элементы, а какой «вставляет» их. :)
Phrogz
1
Спасибо, что действительно помогает, lol.
agentbanks217
Один из лучших комментариев! Спасибо вам большое :)
tvdeyen 06
18
@Phrogz На самом деле пищеварительные системы позвоночных лучше моделировать как очереди, чем как стеки.
Цзянь
8
@Jian :) Правильно: pushон наверху, а shiftна другом конце.
Phrogz

Ответы:

98

Просмотр документации 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"] 
Стив Уит
источник
8
По сути, вы можете думать о 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.

мипади
источник
8
Ну, shift и unshift похожи на pop и push, за исключением того, что они добавляют и удаляют элементы с начала массива, а не с конца.
Альберто Сантини,
2
Этот ответ находится на правильном уровне абстракции.
Стивен Судит,
@Alberto: Или, другими словами, они считают, что фронт - это вершина. Иного не требуется.
Стивен Судит,
5
Я просто указал на то, что, поскольку popи pushтакже являются Arrayметодом, путаницы не должно быть. :-)
Альберто Сантини
3
@Alberto: Это действительно хороший момент. Методы shift / unshift используют переднюю часть как верхнюю, а методы push / pop используют конец как верх. Оба они рассматривают массив как стек, различающиеся только концом, который они используют.
Стивен Судит,
2

Если вы можете думать о массиве как о очереди значений, которые должны быть обработаны, тогда вы можете взять следующее (переднее) значение и «сместить» другое значение, чтобы занять доступное пространство. unshift возвращает значения - возможно, вы не готовы обрабатывать некоторые из них или позволите более позднему коду обработать их.

Тони Делрой
источник
1

Он возвращает первый элемент массива и удаляет его из массива, сдвигая элементы назад на одно место.

Так что сдвиг [1,2,3,4,5]

возвращает 1и устанавливает массив равным [2,3,4,5].

Подробнее здесь .

Роб Грант
источник