こんにちは、かつコーチです。
「複数のデータをまとめて扱いたいけど、配列の操作方法が覚えられない」。
Ruby学習を始めたばかりの方から、よく聞く悩みです。
この記事では、配列の作成方法から、要素の追加・削除、eachを使ったループ処理までを解説します。
読み終える頃には、配列を使った基本的な処理を自分で書けるようになります。
基本の書き方
配列の作成
配列とは、複数のデータを順番に並べて1つの変数にまとめたものです。
[]で囲んで、カンマ区切りで要素を書くと配列を作成できます。
fruits = ["りんご", "みかん", "ぶどう"]
puts fruits.inspect
# => ["りんご", "みかん", "ぶどう"]
numbers = [1, 2, 3, 4, 5]
puts numbers.inspect
# => [1, 2, 3, 4, 5]
要素を取り出すときは、[インデックス]を使います。
インデックスは0から始まる点に注意してください。
fruits = ["りんご", "みかん", "ぶどう"]
puts fruits[0]
# => りんご
puts fruits[2]
# => ぶどう
puts fruits[-1]
# => ぶどう(末尾の要素)
要素の追加:push・unshift
配列の末尾に要素を追加するにはpushメソッド(または<<)を使います。
fruits = ["りんご", "みかん"]
fruits.push("ぶどう")
puts fruits.inspect
# => ["りんご", "みかん", "ぶどう"]
fruits << "もも"
puts fruits.inspect
# => ["りんご", "みかん", "ぶどう", "もも"]
配列の先頭に要素を追加するにはunshiftメソッドを使います。
fruits = ["みかん", "ぶどう"]
fruits.unshift("りんご")
puts fruits.inspect
# => ["りんご", "みかん", "ぶどう"]
要素の削除:pop・shift
配列の末尾から要素を取り除くにはpopメソッドを使います。
fruits = ["りんご", "みかん", "ぶどう"]
removed = fruits.pop
puts removed
# => ぶどう
puts fruits.inspect
# => ["りんご", "みかん"]
配列の先頭から要素を取り除くにはshiftメソッドを使います。
fruits = ["りんご", "みかん", "ぶどう"]
removed = fruits.shift
puts removed
# => りんご
puts fruits.inspect
# => ["みかん", "ぶどう"]
popとshiftはどちらも、取り除いた要素を戻り値として返します。
削除した値をそのまま使いたい場面で便利です。
eachでのループ処理
eachとは、配列の要素を先頭から1つずつ取り出して、同じ処理を繰り返すメソッドのことです。
fruits = ["りんご", "みかん", "ぶどう"]
fruits.each do |fruit|
puts "#{fruit}が好きです"
end
# => りんごが好きです
# => みかんが好きです
# => ぶどうが好きです
do |fruit| ... endの部分をブロックと呼びます。
|fruit|には、配列から取り出した要素が1つずつ入ります。
インデックスも一緒に使いたい場合は、each_with_indexメソッドが便利です。
fruits = ["りんご", "みかん", "ぶどう"]
fruits.each_with_index do |fruit, index|
puts "#{index}番目: #{fruit}"
end
# => 0番目: りんご
# => 1番目: みかん
# => 2番目: ぶどう
よくあるつまずきポイント・エラー対処
存在しないインデックスを指定したときの挙動
私がRubyを学び始めた頃、配列の範囲外を指定してエラーになると思い込んでいました。
❌ Before
fruits = ["りんご", "みかん"]
puts fruits[5]
# => nil
if fruits[5].length > 0
puts "要素があります"
end
# => undefined method `length' for nil:NilClass (NoMethodError)
存在しないインデックスを指定すると、エラーにはならずnil(何もないことを表す値)が返ってきます。
そのnilに対して.lengthのようなメソッドを呼んだ瞬間、NoMethodErrorが発生してしまいました。
✅ After
fruits = ["りんご", "みかん"]
if fruits[5]
puts "要素があります: #{fruits[5]}"
else
puts "指定した位置に要素はありません"
end
# => 指定した位置に要素はありません
配列の要素を使う前に、nilではないかを確認する習慣をつけることで防げるエラーです。
まとめ
この記事のポイント
- 配列は
[]で作成し、[インデックス]で要素を取り出す - 追加は
push(末尾)・unshift(先頭) - 削除は
pop(末尾)・shift(先頭)で、取り除いた値が戻り値になる eachでループ、each_with_indexでインデックス付きループができる- 存在しないインデックスを指定すると
nilが返るため、使う前に確認する
次に読むべき記事
配列の次は、キーと値のペアでデータを扱うハッシュを学びましょう。
「ハッシュの基本:キーと値の扱い方」で、ハッシュの基本操作を解説しています。