RubyのArray#shiftは何をしますか?


88

RubyでArrayクラスのシフトメソッドとシフト解除メソッドが何を行うのかを理解するのに苦労しています。誰かが私が彼らが何をしているかを理解するのを手伝ってくれる?


171
これshift/unshiftpush/pop配列の反対側にあることがわかったら、メソッドの名前から「f」を精神的に落として、「ダンプ」要素と「挿入」要素を覚えておくことができます。:)
Phrogz

1
本当にありがとうございます。
agentbanks217 2011年

これまでで最高のコメントの1つ!ありがとうございます:)
tvdeyen

18
@Phrogz実際、脊椎動物の消化器系は、スタックとしてよりもキューとしてモデル化する方が適切です。
Jian

8
@建:)右:pushそれはトップに、そしてshiftそれはもう一方の端に。
Phrogz 2013年

回答:


98

Rubyドキュメントを見る

Array.shiftは、配列から最初の要素を削除して返します

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

Unshiftは、指定された値を配列の前に付加し、他のすべての要素を1つ上に移動します

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

8
基本的に、シフトとアンシフトはFIFOキューの操作であると考えることができます
Jaco Pretorius

@JacoPretoriusハァッ?shiftそして、unshiftFILOスタックのように動作する、pushshift私は何かについて混乱していない限り、FIFOキューのように行動するだろう。
グレッグシュミット2017

@GregSchmitああ、そうだね。あるいは、実際には、LIFOキューですよね?
Jaco Pretorius 2017

@JacoPretoriusまあ、LIFO == FILOだと思います(先入れ先出しは、パターンが成立する場合、最後の入力が最初に出なければならないことを意味します)。
グレッグシュミット2017

@JacoPretorius LIFOとFILOはどちらも「スタックのように動作する」ことを意味します。
グレッグシュミット2017

52

shiftそして、unshift同様の方法で作用popしてpush:彼らはあなたが追加し、要素(時間あたり通常1)を削除することができたにスタックとして使用するアレイに意図されています。違いは、そういうことだ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]

回答を編集してミパディスレッドを要約する場合は、賛成票をいただければ幸いです。
Steven Sudit

涼しい。また、Rubyについてはあまり詳しくありませんが、JVMで実行すると、これらの要素をすべて移動する必要がないため、プッシュ/ポップが高速になると思います。
Steven Sudit

スタックの類推には賛成ですが、パイプについても考えてください。私たちはプログラマーであるはずなので、shiftは左シフトで、unshiftは左から右への水平配列の右シフトです。
mckenzm

8

最初の要素を取得して配列から削除し、削除された要素を返します。これは基本的に配列をスタックのように扱う方法です。shiftつまり、ポップ、unshiftプッシュです。


8
シフトとアンシフトはポップとプッシュにていますが、配列の最初からではなく最後から要素を追加および削除する点が異なります。
アルベルトサンティーニ

2
この答えは、正確な抽象化レベルです。
Steven Sudit

@アルベルト:または、言い換えれば、フロントをトップと見なしています。それ以外の場合は必要ありません。
Steven Sudit

5
私は以来、と指摘したpoppushもされているArray方法で、混乱を行うべきではありません。:-)
アルベルトサンティーニ

3
@アルベルト:それは実際には良い点です。shift / unshiftメソッドはフロントをトップとして使用し、push / popメソッドはエンドをトップとして使用します。どちらも配列をスタックとして扱い、どちらを使用するかだけが異なります。
Steven Sudit

2

配列が処理される値のキューのようなものであると考えることができる場合は、次の(前の)値を取り、他の値を "シフト"して、使用可能になったスペースを占有できます。unshiftは値を元に戻します-多分あなたはそれらのいくつかを処理する準備ができていないかもしれません、または後でいくつかのコードにそれらを処理させるでしょう。


1

配列の最初の要素を返し、それを配列から削除して、要素を1つ後ろにシフトします。

だからシフト [1,2,3,4,5]

が返され1、配列がに設定されます[2,3,4,5]

詳細はこちら

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.