Ruby的Array#shift方法是什么?

95

我很难理解Ruby中数组类的shift和unshift方法是什么。有人可以帮忙解释一下吗?


181
一旦您了解shift/unshift就像在数组的另一端的push/pop,您可以在心里把这些方法名称中的 'f' 去掉,来记住哪种方法是 '删除' 元素,哪种是 '插入' 元素。 :) - Phrogz
有史以来最好的评论之一!非常感谢你 :) - tvdeyen
18
实际上,脊椎动物的消化系统最好建模为队列而不是栈。 - Jian
8
“@Jian :) Right: push 它到顶部,然后从另一端shift它出去。” - Phrogz
5个回答

105

查看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"] 

9
你可以基本上将 shift 和 unshift 视为对一个先进先出队列(FIFO 队列)的操作。 - Jaco Pretorius
@JacoPretorius 什么?shiftunshift的作用类似于FILO堆栈,而pushshift则会像FIFO队列一样运行,除非我对某些事情感到困惑。 - Greg Schmit
@GregSchmit 哦,你说得对。或者说,是一个后进先出队列,对吧? - Jaco Pretorius
@JacoPretorius 我认为LIFO == FILO(后进先出意味着如果模式成立,则最后进入的必须首先出来)。 - Greg Schmit
@JacoPretorius LIFO和FILO都意味着“行为类似于堆栈”。 - Greg Schmit

59

shiftunshift 的用法与 poppush 一样,它们被用于将数组作为栈使用,您可以在其中添加和删除元素(通常每次一个)。区别在于,shiftunshiftArray 的开头添加/删除元素,实际上移动其他所有元素,而 poppushArray 的末尾添加/删除元素,从而保留其他元素的索引。

示例:

                      # 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
点赞堆栈类比,但也要考虑管道。作为程序员,我们应该将shift视为水平从左到右的数组上的shift-left,而unshift则是shift-right。 - mckenzm

9

它抓取第一个元素,从数组中删除它,并返回已删除的元素。基本上,它是一种将数组视为堆栈的方法:shiftpopunshiftpush


8
shift和unshift与pop和push类似,不同之处在于它们是从数组的开头添加和删除元素,而不是从末尾添加和删除。 - Alberto Santini
2
这个答案在抽象层面上恰到好处。 - Steven Sudit
5
我只是想指出,由于“pop”和“push”也是“Array”方法,因此不应该混淆它们。 :-) - Alberto Santini
3
@Alberto:这实际上是一个很好的观点。shift/unshift 方法将前面作为顶部,而 push/pop 方法将末尾作为顶部。它们都将数组视为堆栈,只是在使用哪个端点上有所不同。 - Steven Sudit
Alberto Santini的回答是最容易阅读和快速理解的。在我看来。 - ahnbizcad
显示剩余6条评论

2
如果你把数组看作是一个需要处理的值队列,那么你可以取出下一个(前面的)值,并将其他值“移位”以占用可用空间。unshift则将值放回去——也许你还没有准备好处理其中一些值,或者稍后的代码将处理它们。

1

它返回数组的第一个元素,并将其从数组中删除,向后移动一个位置。

因此,对于数组 [1,2,3,4,5] 进行移位操作

会返回 1,并将数组设置为 [2,3,4,5]

更多信息在这里


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