Ruby的Array#shift有什么作用?


88

我很难理解Array类的shift和unshift方法在​​Ruby中的作用。有人可以帮助我了解他们的工作吗?


171
一旦你了解到shift/unshiftpush/pop在阵列的另一端,你可以放下精神上从方法的名称“F”来记住一个“垃圾场”元素和一个“插入”他们。:)
Phrogz

1
谢谢,实际上有帮助大声笑。
agentbanks217 2011年

有史以来最好的评论之一!非常感谢您:)
tvdeyen 2012年

18
@Phrogz实际上,脊椎动物的消化系统最好建模为队列而不是栈。

8
@Jian :)对:push它进入顶部,shift另一端伸出。
Phrogz

Answers:


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 2010年

@JacoPretorius嗯?shiftunshift像FILO堆栈一样工作,push并且shift像FIFO队列一样工作,除非我对某些事情感到困惑。
格雷格·施密特

@GregSchmit啊,你是对的。或实际上是LIFO队列,对吗?
Jaco Pretorius

@JacoPretorius好吧,我认为LIFO == FILO(先入后出意味着如果该模式成立,则后入必须先出局)。
格雷格·施密特

@JacoPretorius LIFO和FILO的意思都是“像栈一样”。
格雷格·施密特

52

shiftunshift作用于相似的方式poppush:他们是为了使用数组作为堆栈可向其中追加和删除元素(通常每次一个)。区别仅在于shiftunshift在元素的开头添加/删除元素Array,而实际上移动所有其他元素,而在poppush元素的末尾添加和删除元素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主题,那么我很乐意赞成。
史蒂文·苏迪特

凉。另外,我对Ruby不太了解,但是如果它在JVM上运行,那么我希望push / pop会更快,因为它不必移动所有这些元素。
Steven Sudit 2010年

支持堆栈类比,但也要考虑管道。正如我们应该成为程序员一样,我们还应该考虑shift是水平左移数组的右移,unshift是水平左移数组到右移的右移。
mckenzm

8

它获取第一个元素,将其从数组中删除,然后返回删除的元素。从根本shift上讲,这unshift是将数组视为堆栈的一种方式:弹出,推送。


8
良好的平移和不平移与弹出和推入相似,不同之处在于它们从数组的开头而不是结尾处添加和删除内容。
Alberto Santini 2010年

2
这个答案恰好是正确的抽象级别。
史蒂文·苏迪特

@Alberto:或者,换句话说,他们认为正面是顶部。没有其他要求。
史蒂文·苏迪特

5
我只是指出,因为poppushArray方法,困惑不作出。:-)
Alberto Santini 2010年

3
@Alberto:这实际上是一个好点。移位/取消移位方法将前端用作顶部,而推/弹出方法将末端用作顶部。他们都将数组视为堆栈,仅在使用的那一端不同。
史蒂文·苏迪特

2

如果您可以将数组视为要处理的值队列,则可以将下一个(前一个)值“移”到其他值上以占据可用空间。unshift将值放回去-也许您尚未准备好处理其中的某些值,或者让以后的代码处理它们。


1

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

所以转移 [1,2,3,4,5]

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

这里更多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.