2010-09-15 179 views
74

我很難理解Ruby中Array類的移位和非移位方法。有人能幫我理解他們做什麼嗎?Ruby的Array#shift做什麼?

+148

一旦你知道'shift/unshift'就像數組另一端的'push/pop',你可以從方法的名字中小心地刪除'f'來記住哪個'dump'元素和哪一個「插入」它們。 :) – Phrogz 2011-01-21 17:37:03

+1

謝謝,實際上幫助大聲笑。 – agentbanks217 2011-01-23 18:55:17

+0

有史以來最好的評論之一!非常感謝你:) – tvdeyen 2012-11-06 13:14:13

回答

80

綜觀Ruby Documentation

Array.shift刪除該數組的第一元素,並返回它

a = [1,2,3] 
puts a.shift 
=> 1 
puts a 
=> [2, 3] 

不印字預先考慮所提供的值到的前陣列,將所有其他元素向上移動一個

a=%w[b c d] 
=> ["b", "c", "d"] 
a.unshift("a") 
=> ["a", "b", "c", "d"] 
+6

你基本上可以認爲移位和不移位在FIFO隊列上的操作 – 2010-09-16 09:13:21

+1

'unshift''是如此的一個發現,謝謝! – dgilperez 2012-08-30 18:52:20

+0

@JacoPretorius Huh? 'shift'和'unshift'就像FILO棧一樣,'push'和'shift'就像FIFO隊列一樣,除非我對某些東西感到困惑。 – 2017-12-27 19:37:36

8

它抓取第一個元素,將其從數組中移除,並返回已移除的元素。它基本上是一種像堆棧一樣對待數組的方法:彈出shift,推送unshift

+7

移位和不移位與pop和push類似*除了它們從數組的開始處添加和移除,而不是從結尾開始。 – 2010-09-15 14:36:39

+2

這個答案恰恰處於正確的抽象層次。 – 2010-09-15 14:37:05

+0

@Alberto:或者換句話說,他們認爲前端是頂端。沒有其他要求。 – 2010-09-15 14:37:35

1

它返回數組的第一個元素,並將其從數組中移除,元素移回到一個位置。

所以換檔[1,2,3,4,5]

返回1,並將該陣列爲[2,3,4,5]

更多here

45

shiftunshift作用在相似的方式poppush:他們是爲了使用數組作爲堆棧可向其中追加和刪除元素(每個時間通常之一)。所不同的是在Array之初只是shiftunshift添加/刪除元素,實際上轉變荷蘭國際集團所有其他元素,而在Array結束poppush添加/刪除元素,所以保留其他元素的索引。

實例:

     # 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] 
+0

如果您要編輯您的答案來總結mipadi線程,我會很高興得到讚揚。 – 2010-09-15 14:53:53

+0

很酷。另外,我對Ruby不是很瞭解,但如果它運行在JVM上,那麼我會期望push/pop會更快,因爲它不必移動所有這些元素。 – 2010-09-15 15:52:33

+0

Upvote for stacky,但也想到管道。因爲我們應該是程序員,所以我們也應該認爲轉變是一種左移,右移是右轉陣列的右移。 – mckenzm 2016-07-27 23:08:55

2

如果您可以將數組視爲要處理的值的隊列,那麼您可以獲取下一個(前)值並「移動」另一個值以佔用可用的空間。 unshift將值重新放入 - 也許你還沒有準備好處理其中的一些,或者讓稍後的代碼處理它們。