Ruby: Какой самый простой способ удалить первый элемент из массива?

203

Допустим, у меня есть массив

[0, 132, 432, 342, 234]

Каков самый простой способ избавиться от первого элемента? (0)

  • 1
    «shift» - поп, а «unshift» - толчок. В какую смену входит количество параметров для всплытия
Теги:

10 ответов

235
Лучший ответ

"pop" первого элемента массива называется " shift" ( "unshift" являющийся операцией добавления одного элемента перед массивом).

  • 10
    Обратите внимание, что это изменяет массив и возвращает nil в пустом массиве. См drop для альтернативы, как упомянуто в другом ответе.
289

Используйте метод shift для массива

>> x = [4,5,6]
=> [4, 5, 6]                                                            
>> x.shift 
=> 4
>> x                                                                    
=> [5, 6] 

Если вы хотите удалить n исходных элементов, вы можете использовать x.shift(n)

  • 3
    объяснение должно быть объединено в правильный ответ, так как содержание одинаково
275
a = [0,1,2,3]

a.drop(1)
# => [1, 2, 3] 

a
# => [0,1,2,3]

и дополнительно:

[0,1,2,3].drop(2)
=> [2, 3]

[0,1,2,3].drop(3)
=> [3] 
  • 15
    Лучший ответ, так как (a) оценивает усеченный массив, и он работает, как и ожидалось, для пустого массива: [].drop(1) => []
  • 4
    Также лучший ответ, потому что OP сказал: «Какой самый простой способ избавиться от первого элемента»
Показать ещё 2 комментария
107
[0, 132, 432, 342, 234][1..-1]
=> [132, 432, 342, 234]

Таким образом, в отличие от shift или slice, это возвращает модифицированный массив (полезный для одного лайнера).

  • 11
    Один момент, за которым нужно следить: если массив пуст, он возвращает nil: [][1..-1] => nil а не [] .
  • 2
    Разве [1,2,3].shift является однострочным?
Показать ещё 3 комментария
81

Это довольно аккуратно:

head, *tail = [1, 2, 3, 4, 5]
#==> head = 1, tail = [2, 3, 4, 5]

Как написано в комментариях, есть преимущество не изменять исходный список.

  • 2
    очень умный, и работает отлично. Как только вы это сделаете, в вашем распоряжении будут обе переменные «голова» и «хвост».
  • 3
    Это напоминает мне много шуток. (let ((head (car mylist)) (tail (cdr mylist)) ...)
Показать ещё 4 комментария
17

или a.delete_at 0

10

Вы можете использовать:

a.slice!(0)

slice! обобщает на любой индекс или диапазон.

9

Использовать метод сдвига

array.shift(n) => Remove first n elements from array 
array.shift(1) => Remove first element

https://ruby-doc.org/core-2.2.0/Array.html#method-i-shift

4

Вы можете использовать метод Array.delete_at (0), который удалит первый элемент.

 x = [2,3,4,11,0]
 x.delete_at(0) unless x.empty? # [3,4,11,0]
  • 0
    Я не думаю, unless x.empty? является необходимым. Он просто возвращает nil если индекс находится вне диапазона.
0

Вы можете использовать:
arr - [arr[0]] или иначе arr - [arr.shift()] или просто arr.shift(1)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню