2022/02/20(日) ゼロからわかるRuby超入門Chapter4

配列

  • 配列は、要素と呼ばれる複数のオブジェクトをまとめるための部品
  • 配列自身もArrayクラスのオブジェクト
  • 配列に入る個々のオブジェクトを要素と呼ぶ
  • 配列に新たに要素を追加したり、既に入っている要素を削除したり出来る
  • 配列では、種類の異なるオブジェクトを1つの配列にまとめることが出来る
  • 配列名は慣習的に複数形の単語にする(複数のオブジェクトが要素として格納されるため)
# 配列名は複数形
sugers = ["白砂糖", "黒糖", "角砂糖"]
coffee_beans = ["Brazil", "Kenya", "Nicarragua"]
even_numbers = [2, 4, 6]

# 種類の異なるオブジェクト(型の異なるオブジェクト)を1つの配列にまとめる
somethings = ["カフェラテ", 400, false] 
=> ["カフェラテ", 400, false]

# 配列に入っている要素は、それぞれ異なる型のオブジェクト
somethings[0].class
=> String
somethings[1].class
=> Integer
somethings[2].class
=> FalseClass


# 配列はArrayオブジェクト
somethings.class
=> Array

["カフェラテ", 400, false].class
=> Array

配列に入っている要素を取得する

  • 配列の特定の要素を取得する際は、インデックス番号を指定する
  • インデックス番号とは、配列の複数ある要素から1つを特定することが出来るように、0から1,2と順に要素に割り当てられた番号のこと。
  • 1番後ろの要素を取得する場合は、「-1」を後ろから2番目の要素を取得する場合は「-2」をインデックス番号として指定する
  • インデックス番号で指定する以外にもlastメソッドで配列の先頭の要素を、firstメソッドで配列の末尾の要素を取得できる。
drinks = ["コーヒー", "カフェラテ", "紅茶", "カルピス", "オレンジジュース"]
=> ["コーヒー", "カフェラテ", "紅茶", "カルピス", "オレンジジュース"]

# インデックス番号を指定して、特定の要素を取得する
drinks[0]
=> "コーヒー"
drinks[1]
=> "カフェラテ"
drinks[2]
=> "紅茶"
drinks[3]
=> "カルピス"
drinks[4]
=> "オレンジジュース"

# 取得した要素オブジェクトのクラス
drinks[4].class
=> String

# 配列の末尾の要素を取得
drinks[-1]
=> "オレンジジュース"

drinks.last
=> "オレンジジュース"

# 配列の先頭の要素を取得
drinks.first
=> "コーヒー"
  • 配列に対して、対応する要素がない場所から取得しようとすると、nilオブジェクトが返る。
  • nilオブジェクトは、何もないことを表す。
# drinks配列は要素を5つ持つので、インデックス番号は4まの要素しか存在しない=>nilオブジェクトが返る
drinks[5]
=> nil

配列に要素を追加・削除する

  • 要素を追加するメソッド
    • pushメソッドは、配列の末尾に要素を追加する
    • unshiftメソッドは、配列の先頭へ要素を追加する
    • >>は、配列の末尾に要素を追加する
# 配列の先頭に要素を追加
drinks.unshift("キャラメル・マキアート")
=> ["キャラメル・マキアート", "コーヒー", "カフェラテ", "紅茶", "カルピス", "オレンジジュース"]

# 配列の末尾に要素を追加
drinks.push("マンゴー パッション ティー フラペチーノ")
=> ["キャラメル・マキアート", "コーヒー", "カフェラテ", "紅茶", "カルピス", "オレンジジュース", "マンゴー パッション ティー フラペチーノ"]
  • 要素を削除するメソッド
    • popメソッドは、配列の末尾から要素を1つ削除する
    • shiftメソッドは、配列の先頭から要素を1つ削除する
# 配列の末尾から要素を1つ削除
drinks.pop
=> "マンゴー パッション ティー フラペチーノ"#=> 削除した要素を戻り値を返す
drinks
=> ["キャラメル・マキアート", "コーヒー", "カフェラテ", "紅茶", "カルピス", "オレンジジュース"]

# 配列の先頭から要素を1つ削除
drinks.shift
=> "キャラメル・マキアート"#=> 削除した要素を戻り値を返す
drinks
=> ["コーヒー", "カフェラテ", "紅茶", "カルピス", "オレンジジュース"]

配列の足し算・引き算

  • 配列の足し算は、2つの配列をつなげた新しい配列を作成します
  • 配列の引き算は、元の要素から引く配列の要素を取り除いた新しい配列を作成します。
# 配列の足し算
a1 = [1, 2, 3]
a2 = [4, 5]
a1 + a2 #=> [1, 2, 3, 4, 5]

# 配列b1にしかない要素を取得する(引き算で)
b1 = [1, 2, 3]
b2 = [1, 3, 5]
b1 - b2 #=> [2]

配列の全要素に繰り返し処理を行う

drinks
=> ["コーヒー", "カフェラテ", "紅茶", "カルピス", "オレンジジュース"]
# 配列の要素に繰り返し処理
# 配列オブジェクトdrinksの全要素を表示する
irb(main):033:0> drinks.each do |drink|
irb(main):034:1* puts drink
irb(main):035:1> end
コーヒー
カフェラテ
紅茶
カルピス
オレンジジュース
=> ["コーヒー", "カフェラテ", "紅茶", "カルピス", "オレンジジュース"]
  • eachメソッドは配列の全要素を繰り返し処理するメソッド
  • 配列の各要素はインデックス番号0番から順にdrinkという変数に格納され、puts処理が行われます。それが要素数分、繰り返される。
  • 配列の要素数がいくつであっても、eachメソッドを使えば全要素を繰り返し処理を実行できる(要素数によってプログラムを書き換える必要がない)
  • breakを使って、繰り返し処理を途中で終わらせることができる。ある条件に達すると、繰り返しを終了するなどして使用する。
  • nextは、ある特定の回の時に繰り返し処理を中断して、次の繰り返しに処理を移す
  • 繰り返す範囲を指定する場合は、Rangeオブジェクトを指定します。
# 繰り返し処理を途中で終わらせる
[1, 2, 3].each do |x|
    break if x == 2 # xの値が2である時、繰り返し処理を終わらせる(処理終了)
    puts x
end
#=> 1

# xが2の時だけ繰り返し処理を中断する
[1, 2, 3].each do |x|
    next if x == 2 # xの値が2である時、繰り返し処理を終わらせる(処理終了)
    puts x
end
#=> 1
#=> 3

# 3~5の数値を繰り返し処理する
(3..5).each do |x|
    puts x
end
#=> 3
#=> 4
#=> 5

参考

ゼロからわかるRuby超入門 chapter4