Мне трудно понять, что делают методы shift и unshift класса Array в Ruby. Может кто-нибудь помочь мне понять, что они делают?
push
он наверху, а shift
на другом конце.
Мне трудно понять, что делают методы shift и unshift класса Array в Ruby. Может кто-нибудь помочь мне понять, что они делают?
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 возвращает значения - возможно, вы не готовы обрабатывать некоторые из них или позволите более позднему коду обработать их.
shift/unshift
они похожиpush/pop
на другой конец массива, вы можете мысленно отбросить букву «f» из имени методов, чтобы запомнить, какой из них «выгружает» элементы, а какой «вставляет» их. :)