Rubyには配列を操作する便利なメソッドがたくさんありますが、配列の先頭に要素を追加するメソッドがunshiftです。
配列の先頭に要素を追加するとインデックスを振りなおす必要があるので面倒ですが、unshiftメソッドならインデックスの数字を意識することなく使える便利なメソッドです。今回はunshiftメソッドの使い方と使用例を紹介します。
Rubyで配列を操作する
Rubyには配列を操作する便利なメソッドがいくつもあります。今回紹介するunshiftもそのようなメソッドの1つです。unshiftメソッドを解説する前に、配列を操作するメソッドの使い方について紹介します。
配列の先頭に要素を追加するには
もし、配列の先頭に要素を追加する場合、どうすればいいでしょうか。多くのプログラム言語では、インデックスをずらして、最後に先頭に要素を追加します。
例えば下記のような配列の先頭に要素0を追加したとします。すると、配列arr[]のインデックスの数字をずらさなければなりません。
配列の先頭に要素を追加する例
(追加前) arr[0] = 1, arr[1] = 2, arr[2] = 3
(追加後) arr[0] = 0, arr[1] = 1, arr[2] = 2, arr[3] = 3
Rubyではメソッドを使う
先ほど紹介したように配列の先頭に要素を追加した場合、インデックスの数字をずらさなければなりません。しかしRubyには配列を操作する便利なメソッドがあります。そして配列の先頭に要素を操作するメソッドがshiftメソッドとunshiftメソッドです。
shiftメソッドとunshiftメソッドを使えば、次のようにシンプルなプログラムを記述できます。
配列の先頭から要素を取り出す例
a = [1, 2, 3, 4, 5].shift p a # [2, 3, 4, 5] を表示する(先頭の1が削除されている)
配列の先頭に要素を追加する例
a = [1, 2, 3, 4, 5].unshift 0 p a # [0, 1, 2, 3, 4, 5] を表示する(先頭に0が追加されている)
配列の最後の要素を操作する
先ほど配列の先頭に要素を削除したり追加する使い方を説明しましたが、配列の最後の要素を削除したり追加するメソッドもあります。
配列の最後を取り出すのはpopメソッドで、配列の最後に要素を追加するにはpopメソッドです。
配列の最後から要素を取り出す例
a = [1, 2, 3, 4, 5].pop p a # [1, 2, 3, 4] を表示する(最後の5が削除されている)
配列の最後に要素を追加する例
a = [1, 2, 3, 4, 5].push 6 p a # [1, 2, 3, 4, 5, 6] を表示する(最後に6が追加されている)
unshiftメソッドの使い方
先ほど紹介したように配列の先頭に要素を追加するにはunshiftメソッドを使います。なおunshiftを使うことで配列の先頭に複数の要素を追加することも可能です。次からunshiftメソッドの文法や使い方を紹介します。
unshiftの文法
unshiftメソッドはArrayクラスのメソッドの1つで、指定されたオブジェクトを配列の先頭に引数で指定した要素を挿入します。なおこのメソッドは対象となる配列を変化させてしまうので注意してください。
unshiftの文法
配列.unshift オブジェクト
unshiftメソッドの例
arr = [1, 2, 3] arr.unshift 0 p arr # [0, 1, 2, 3]を表示する
またunshiftの引数に複数のオブジェクトを指定した場合、その順序で配列の先頭に追加します。
複数のオブジェクト追加するunshiftメソッドの例
arr [3, 4, 5] arr.unshift 1, 2 p arr # [1, 2, 3, 4, 5]を表示する
unshiftメソッドと同じ機能のメソッド
Rubyには別名が設定されたメソッドがいくつもあります。そしてunshiftメソッドにも別名のメソッドがあり、それがprependメソッドも利用可能です。
prependメソッドの文法
配列.prepend オブジェクト
prependメソッドの使用例
rr = [1, 2, 3] arr.prepend 0 p arr # [0, 1, 2, 3]を表示する
またprependメソッドも複数のオブジェクトを追加できます。
複数のオブジェクト追加するprependメソッドの例
arr [3, 4, 5] arr.prepend 1, 2 p arr # [1, 2, 3, 4, 5]を表示する
unshiftメソッドの使用例
配列の末尾に要素を追加するpushメソッドは、新たに配列を作る際などでよく利用されます。しかし先頭に要素を追加するunshiftメソッドを使うケースは少ないかもしれません。
次からunshiftメソッドの使用例を紹介します。
Rubyの参照パスを追加する
Rubyのrequireメソッドで指定できる外部ライブラリの参照パスは、Rubyの環境変数$LOAD_PATHに登録されており、これを編集することで参照パスの追加が可能です。なお環境変数$LOAD_PATHは配列です。優先して参照してほしいパスはunshiftメソッドで配列の先頭に入れてください。
実行中のソースファイルがあるディレクトリを参照パスの先頭に追加する命令は次のとおりです。
$LOAD_PATH.unshift File.dirname(__FILE__)
unshiftで配列を追加したら?
もしunshiftメソッドで追加するオブジェクトに配列を指定したらどうなるでしょうか。配列はオブジェクトです。そのまま要素として挿入されるので、2次元の配列が作られます。つまり配列を連結するのにunshiftメソッドは使えません。
unshiftメソッドで配列を追加したら
先ほど紹介したように、もしunshiftメソッドの引数に配列を指定した場合、その配列が先頭に追加されるので2次元の配列が作られます。
unshiftメソッドで配列を追加した例
arr = [3, 4, 5] add = [1, 2] arr.unshift add p arr # [[1, 2], 3, 4, 5]
配列を結合するには
先ほど紹介したように、unshiftメソッドでは配列同志を連結できません。末尾に追加するpushメソッドも同じです。Rubyで配列を結合するにはどうすれば良いでしょうか。
配列を結合するにはconcatメソッドを使用します。concatメソッドは対象となる配列の末尾に、引数の配列の要素を追加します。なおconcatとは連結という意味の英単語です。
concatメソッドの使用例
arr = [1, 2, 3] add = [4, 5] arr.cpncat add p arr # [1, 2, 3, 4, 5]
配列同志を+演算子で連結する
先ほどconcatメソッドによる配列の連結方法を紹介しましたが、+演算子を使っても配列の連結が可能です。元の配列を残したい場合は、+演算子を利用してください。
+演算子を使った配列連結例
arr = [1, 2, 3] add = [4, 5] out = arr + add p out # [1, 2, 3, 4, 5]
まとめ
これまで紹介したようにunshiftメソッドは引数で指定したオブジェクトを配列の先頭に追加するメソッドです。ただし対象とする配列を変更してしまうので注意してください。
なおunshiftっメソッドの引数に配列を指定すると2次元の配列が作られます。もし、配列を連結したい場合は、concatメソッドや+演算子を利用しましょう。
配列の末尾に要素を追加するpushメソッドと違い、unshiftメソッドはRubyのプログラムの中で利用されるケースは少ないかもしれません。しかしRubyのプログラムでは、配列の操作をメソッドで処理するケースが多いので、ぜひunshiftメソッドを利用し、Rubyらしいシンプルで読みやすいプログラムを作成してください。