Ruby: 如何最简单地从数组中删除第一个元素?

313

假设我有一个数组

[0, 132, 432, 342, 234]

最简单的方法是如何摆脱第一个元素?(0)


2
"shift" 是弹出(pop)操作,而 "unshift" 则是推入(push)操作。其中,"shift" 接受要弹出的参数数量。 - Arun
11个回答

451

使用.drop(1)

这样做有一个好处,它可以返回一个新的数组,并删除第一个元素,而不是使用.shift,后者返回已删除的元素,而不是删除了第一个元素的数组。

注意:它不会影响/改变原始数组。

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] 

21
自 (a) 得出已修剪的数组后,它可以正常处理空数组:[].drop(1) => [] - fearless_fool
4
由于OP说“最简单的方法是如何删除第一个元素”,因此这也是最佳答案。 - notaceo
5
这个回答表明,即使第一个并且最受期望的答案已经获得了超过100个赞,仍然建议向下滚动查看。谢谢。 - maddin2code
7
+1是为了返回一个修改后的数组,而shift则会直接在原数组上进行修改,并返回移除的元素(如果数组为空,则返回nil)。 - yuval
大家好,OP没有明确说明他们是否希望该操作改变原始数组。因此,这个答案并不比#shift的被接受答案更好。实际上,在我看来,#shift更符合OP“摆脱”的措辞。然而,一个完整的答案应该提供#shift和#drop,并解释它们之间的区别。 - ryanc

331

使用数组的shift方法。

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

如果你想要移除前n个元素,可以使用x.shift(n)


3
解释应该合并到正确答案中,因为内容是相同的。 - Yolgie

315

从数组中弹出第一个元素被称为"shift"(在数组前面添加一个元素的操作为"unshift")。


15
请注意,这会改变数组并在空数组时返回nil。如其他答案所述,请参考drop以获取替代方法。 - Jay

140
[0, 132, 432, 342, 234][1..]
=> [132, 432, 342, 234]

所以与 shiftslice 不同的是,这个方法返回一个新数组,不会修改原始数组(适用于一行代码的情况)。


14
需要注意的一点是:如果数组为空,则返回nil:[][1..-1] => nil而不是[] - Mohamad
3
[1,2,3].shift 不就是一行代码吗? - thekingoftruth
4
是的,但它评估为你扔掉的元素,而不是数组的其余部分,所以需要另起一行。 - fearless_fool
4
我喜欢这个答案,因为它是一个可以在任何地方使用的一行表达式。为了避免[]与nil之间的问题,你可以使用arry[1..-1] || []。但使用arry.drop(1)更好。 - fearless_fool
我选择这个因为它很简单,你怎么得到“减去被移出的数组”,我不知道那会怎么工作... 这是主要答案,但似乎并没有回答问题,因为对于新手来说下一步不明显! - Louis Maddox
我喜欢这种方法,因为它只有一行并且不修改原始数组。 - svelandiag

116

这相当不错:

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

正如评论中所写,不改变原始列表有一个优势。


2
非常聪明,而且完美地工作。一旦你这样做了,你就可以使用变量“head”和“tail”。 - nfriend21
4
这让我想起了Lisp语言。(let ((head (car mylist)) (tail (cdr mylist)) ...) - thekingoftruth
@hurikhan77 很好!我一直想试试看。知道Darcs是用Haskell编写的,这让我更感兴趣了。 - thekingoftruth
7
这个版本的优势在于不改变原始列表。 - Paweł Obrok
2
header,*properties = CSV.read(file_path, encoding: 'ISO-8859-1') 请将翻译文本仅返回。 - juliangonzalez

18

18

or a.delete_at 0


15

你可以使用:

a.slice!(0)

slice! 方法可以适用于任何索引或范围。


6
您可以使用Array.delete_at(0)方法来删除第一个元素。
 x = [2,3,4,11,0]
 x.delete_at(0) unless x.empty? # [3,4,11,0]

我认为 unless x.empty? 是不必要的。如果索引超出范围,它只会返回 nil - webninja

6

您可以使用:

arr - [arr[0]]

或者

arr - [arr.shift]

或者简单地说
arr.shift(1)

arr - [arr[0]] 这个操作对于 a = [1,2,3,4,5,6,7,8,1,2,3,4] 这个数组会失败,因为 1 被重复了。 - vidur punj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接