Що робить Ruby's Array # shift?


88

Мені важко зрозуміти, що роблять у Ruby методи shift і unshift класу Array. Чи може хтось допомогти мені зрозуміти, чим вони займаються?


171
Після того, як ви дізнаєтеся, що shift/unshiftсхоже push/popна інший кінець масиву, ви можете подумки викинути «f» з імені методів, щоб запам'ятати, який з них «скидає» елементи, а який «вставляє» їх. :)
Phrogz

1
Дякую, що насправді допомагає хаха.
agentbanks217

Один із найкращих коментарів! Велике спасибі :)
tvdeyen

18
@Phrogz Насправді, травні системи хребетних краще моделювати як черги, ніж як стеки.
Цзянь

8
@Jian :) Правильно: pushце вгорі, а shiftв інший кінець.
Фрогц

Відповіді:


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
В основному ви можете думати про зміну та зрушення як про операцію в черзі FIFO
Jaco Pretorius

@JacoPretorius Так? shiftі unshiftдіятиме як стек FILO, pushі shiftдіятиме як черга FIFO, якщо мене щось не бентежить.
Грег Шміт

@GregSchmit Ах, ти маєш рацію. Або насправді, черга LIFO, так?
Джако Преторіус

@JacoPretorius Ну, я думаю, LIFO == FILO (first in last out означає, що останній in повинен вийти першим, якщо шаблон має місце).
Грег Шміт

@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, я був би радий проголосувати.
Steven Sudit

Класно. Крім того, я не надто обізнаний про Ruby, але якщо він працює на JVM, то я би очікував, що push / pop буде швидшим, оскільки йому не потрібно переміщувати всі ці елементи.
Steven Sudit

Проголосуйте за аналогію стека, але подумайте і про труби. Оскільки ми повинні бути програмістами, ми також повинні думати, що зсув - це зсув вліво, а unshift - зсув вправо на горизонтальному масиві зліва направо.
mckenzm

8

Він захоплює перший елемент, видаляє його з масиву та повертає видалений елемент. В основному це спосіб поводження з масивом як зі стеком: shiftє поп, unshiftє push.


8
Ну shift і unshift схожі на pop і push, за винятком того, що вони додають і видаляють речі з початку масиву, а не з кінця.
Альберто Сантіні

2
Ця відповідь на точно правильному рівні абстракції.
Steven Sudit

@Alberto: Або, іншими словами, вони вважають фронт вершиною. Не вимагається, щоб це було інакше.
Steven Sudit

5
Я просто вказував, що, оскільки popі pushє також Arrayметодом, плутанини робити не слід. :-)
Альберто Сантіні

3
@Alberto: Це насправді хороший момент. Методи shift / unshift використовують фронт як верх, тоді як методи push / pop використовують кінець як верх. Вони обидва розглядають масив як стек, різнячись лише тим, яким кінцем вони користуються.
Стівен Судіт,

2

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


1

Він повертає перший елемент масиву і видаляє його з масиву, зміщуючи елементи назад на одне місце.

Так зміщується [1,2,3,4,5]

повертається 1і встановлює масив як[2,3,4,5] .

Більше тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.