【Ruby】配列の基礎をまとめてみた!

rails

こんにちは!tekute-kuです。

今回は配列の基礎をやっていきたいと思います。

配列を理解することは、ハッシュやRailsのデータモデルの理解にもつながりますのでここでしっかりと押さえておきましょう。

この記事を書いた目的

プログラミングをやっていると配列やハッシュなどを理解しなければ先に進むことができません。そのためアウトプットをして知識を定着させるためにここにまとめます。この記事が誰かお役に立てれば幸いです。

配列とは

配列とは特定の順序を持つ要素のリストです。英語で「array」と言います。

例えば[dog, cat, rabbit]のようなリストをいいます。

Rubyでは配列を[ ]で括り、文字列と文字列の間をコンマ『 , 』で区切ります。

配列にはインデックスがあり各要素に割り振られています。

例えば先ほどの例でいうと

[dog, cat, rabbit] ⇨ [0, 1, 2]

となります。インデックスは0から始まるので一番初めに来ている要素には0が割り振られます。

このようにRubyではゼロオリジンを採用しており、他の言語でも同様のようです。

またインデックスは-1も割り振られており最後の要素が-1となります。

[dog, cat, rabbit] ⇨ [0, 1, -1]

アクセス方法

これを利用すれば配列の各要素を簡単に取り出すことができます。

a = ["dog", "cat", "rabbit"]
=> ["dog", "cat", "rabbit"]
a[0]
=> "dog"
a[1]
=> "cat"
a[2]
=> "rabbit"

このようにRubyでは角カッコ[ ]により配列にアクセスします。

a = ["dog", "cat", "rabbit"]
=> ["dog", "cat", "rabbit"]

a[-1]
=> "rabbit"

マイナスのインデックスからでも要素にアクセスすることができます。

様々なメソッドにも応答する

配列は文字列と同様にいろんなメソッドに応答します。

a = ["dog", "cat", "rabbit"]
=> ["dog", "cat", "rabbit"]
a.length  #lengthメソッドに応答
=> 3

#様々なメソッドに応答
a.empty? 
=> false
a.include?("cat")
=> true
a.include?("tiger")
=> false
a.sort
=> ["cat", "dog", "rabbit"]
a.shuffle
=> ["rabbit", "dog", "cat"]

注目したいのはa自身の配列は何も変更されていないことです。

a = ["dog", "cat", "rabbit"]
=> ["dog", "cat", "rabbit"]
a.sort
=> ["cat", "dog", "rabbit"]
a
=> ["dog", "cat", "rabbit"] #aの配列自身は変化していない

もしもa自身の配列を変更したいのであれば「破壊的」メソッドを使用します。

破壊的メソッドとは

破壊的メソッドとはオブジェクトであるレシーバ自身の値を変えてしまうメソッドのことを言います。

例えるならば、ドラマの撮影である役柄を演じていたが、監督の指示で急に全く違う役柄を演じることになった配役といったところでしょうか。

配役がオブジェクトで監督の指示がメソッドになります。(他に良い例えが見つかりません笑)

注意しなければならないのは、破壊的メソッドを使用すると以後のオブジェクトの値が変更されてしまい、当初設定したオブジェクトの値は破壊されてしまうことです。

実際に見てみましょう。

a = ["dog", "cat", "rabbit"]
=> ["dog", "cat", "rabbit"]
a.shuffle! #Rubyの破壊的メソッドは最後尾に!をつける
=> ["rabbit", "dog", "cat"]
a #aの内容を確認
=> ["rabbit", "dog", "cat"]
a #破壊的メソッド以降、aの配列は変更されている
=> ["rabbit", "dog", "cat"]

破壊的メソッドにより配列の順序が変更され、当初の配列は破壊されました。

要素を追加する

配列に要素を追加したい場合は、pushメソッドまたは同等の<<演算子を使います。

a = ["dog", "cat", "rabbit"]
=> ["dog", "cat", "rabbit"]
a.push("bear")
=> ["dog", "cat", "rabbit", "bear"]
a << "lion"
=> ["dog", "cat", "rabbit", "bear", "lion"]
a << "tiger" << "monkey" #配列に連続して追加する
=> ["dog", "cat", "rabbit", "bear", "lion", "tiger", "monkey"]

このように配列に連続して追加することも可能です。

配列を連結する

配列を連結して単なる文字列にすることもできます。

配列を連結するにはjoinメソッドを使用します。

a = ["dog", "cat", "rabbit"] 
=> ["dog", "cat", "rabbit"] 

a.join => "dogcatrabbit" 
a.join(", ") #カンマとスペースで連結する 
=> "dog, cat, rabbit" 
a.join(" ") #スペースのみで連結する 
=> "dog cat rabbit"

範囲オブジェクトを配列に変換する

範囲(range)は配列と密接に関係しています。

範囲オブジェクトを配列に変換するにはto_aメソッドを使用します。

0..5 #範囲オブジェクト
=> 0..5
(0..5).to_a #範囲オブジェクトを配列に変換
=> [0, 1, 2, 3, 4, 5]

0..5.to_a #範囲オブジェクトに()をつけないと以下の通りエラーになる
NoMethodError: undefined method `to_a' for 5:Integer

上のように範囲オブジェクトに( )カッコをつけないと5に対してメソッドが呼び出されてしまいエラーになってしまいます。

文字列を配列に変換する

文字列を配列に変換するには%wを使用します。

a = %w[a b c d] #%wで配列に変換
=> ["a", "b", "c", "d"]

a[1..2] #インデックスを使用して要素を呼び出す
=> ["b", "c"]

インデックス -1を活用して呼び出す

最初に出てきましたがインデックスに-1を指定すると、最後の要素を呼び出してくれます。これは配列が長くて最後の要素のインデックスが分かりにくい場合に大変便利です。

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] #配列が長くて最後の要素のインデックスがいくつなのか分かりにくい
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

a[-1] #インデックス-1を指定すれば簡単にわかる
=> 13

a[4..-1]
=> [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

まとめ

  • 配列の各要素にはインデックスがあり最後尾は-1が割り当てられており[ ]角カッコでアクセスする。
  • インデックスはゼロオリジンで0から数えていく。
  • 様々なメソッドに対応し、破壊的メソッドでオブジェクト自身を変更できる。
  • 配列を追加、連結したり、文字列を配列に変換したりできる。(pushメソッド、joinメソッド、to_aメソッド、%wなどを使用)
  • インデックス-1を活用すれば長い配列の最後の要素に簡単にアクセスできる。

 

コメント