💡 この記事でわかること
- 配列とハッシュの違い、使い分け
- 配列の作り方と、要素の取り出し・書き換え(後ろから数える
[-1]も) push・<<・pop・deleteなど、要素を追加・削除する方法- ハッシュのキー(シンボル)と値の扱い方、存在しないキーと
nil eachで配列・ハッシュを1つずつ処理する方法
1. 配列とハッシュとは?
配列もハッシュも、
👉 複数の値をまとめて1つの変数で扱うためのしくみです。Rubyには代表的なものが2つあります。
- 配列(Array):値を順番に並べる。
0から始まる番号(インデックス)で管理する - ハッシュ(Hash):値を「キー(名前)」と「値」のペアで管理する。他の言語の連想配列・辞書にあたる
# 配列:3人の名前を順番に並べる
names = ["太郎", "花子", "次郎"]
# ハッシュ:1人の情報を項目名つきで持つ
user = { name: "太郎", age: 20 }💡 配列は [ ]、ハッシュは { } で書きます。PHPのように両方を1つの型でまとめて扱うのではなく、Rubyでは配列(Array)とハッシュ(Hash)は別のものとして区別されます。データ型をまだ確認していない場合は、先に読んでおくとスムーズです。
👉 Rubyのデータ型(文字列・数値・nil)についての記事はこちら
2. 配列の作り方と取り出し方
要素は [ ] の中に値をカンマ区切りで並べて作ります。取り出すときは 0から始まる番号(インデックス)を [ ] で指定します。
fruits = ["りんご", "みかん", "ぶどう"]
puts fruits[0] # りんご(1番目)
puts fruits[2] # ぶどう(3番目)
puts fruits[-1] # ぶどう(うしろから1番目)
fruits[1] = "もも" # 2番目を書き換える
puts fruits[1] # もも👉 Rubyでは fruits[-1] のように、マイナスの番号で「うしろから数える」書き方ができます(PHPではできませんが、Pythonと同じ感覚で使えます)。存在しない番号を指定してもエラーにはならず、nil が返ります。
連続した範囲を切り出したいときは、[開始番号, 個数] か範囲オブジェクトを使います。
nums = [10, 20, 30, 40, 50]
p nums[1, 2] # [20, 30](1番目から2個)
p nums[1..3] # [20, 30, 40](1〜3番目)
p nums.first # 10
p nums.last # 503. 配列の要素の追加・削除
tasks = ["買い物", "掃除"]
tasks << "洗濯" # 末尾に追加 → ["買い物", "掃除", "洗濯"]
tasks.push("料理") # これも末尾に追加
last = tasks.pop # 末尾を取り出して削除(last に "料理")
first = tasks.shift # 先頭を取り出して削除(first に "買い物")
tasks.unshift("起床") # 先頭に追加
tasks.delete("掃除") # 値を指定して削除
tasks.delete_at(0) # 番号を指定して削除
puts tasks.length # 要素数
puts tasks.include?("洗濯") # 含まれているか(true / false)配列 << 値:末尾に1つ追加する(いちばんよく使う書き方)push/pop:末尾に追加 / 末尾を取り出して削除unshift/shift:先頭に追加 / 先頭を取り出して削除delete(値)/delete_at(番号):値・番号を指定して削除length(sizeでも可):要素数。include?(値):値が含まれるか
💡 末尾に「?」が付くメソッド(include? など)は、true か false を返すという目印です。Rubyの慣習で、名前を見ただけで「これは真偽を返すメソッドだ」と分かるようになっています。
4. each で1つずつ処理する
fruits = ["りんご", "みかん", "ぶどう"]
fruits.each do |fruit|
puts fruit
end
# 実行結果: りんご みかん ぶどう👉 配列と each はセットでよく使います。中身をまとめて確認したいときは p 配列(p fruits)を使うと、["りんご", "みかん", "ぶどう"] のように配列の形のまま表示されます。
👉 Rubyのif文・for文・while文(eachの基本)についての記事はこちら
5. ハッシュの作り方と取り出し方
ハッシュは キー => 値 のペアをカンマ区切りで { } に並べて作ります。値を取り出すときは、番号ではなくキーを [ ] で指定します。
user = { :name => "太郎", :age => 20 }
puts user[:name] # 太郎
puts user[:age] # 20👉 キーの先頭に付いている :name は「シンボル」といって、Rubyでハッシュのキーによく使われる値です。文字列 "name" と似ていますが、「名札」のように名前そのものを表すための軽量な値で、ハッシュのキーに向いています。
キーがシンボルのときは、{ name: "太郎", age: 20 } という省略した書き方ができます。こちらのほうが一般的です。
# この2つは同じ意味
user = { :name => "太郎", :age => 20 }
user = { name: "太郎", age: 20 }
# 書き方が name: でも、取り出すときは [:name]
puts user[:name] # 太郎💡 name: と書いても、取り出すときは user[:name] のようにコロンを前に付けたシンボルで指定します。ここは書き方と取り出し方でコロンの位置が変わるため、最初は戸惑いやすいポイントです。
存在しないキーを指定した場合は、エラーにならず nil が返ります(PHPのように警告は出ません)。「なかったときの値」を決めたいときは fetch を使います。
user = { name: "太郎" }
p user[:email] # nil
puts user.fetch(:email, "未登録") # 未登録(第2引数がないときはエラーになる)6. ハッシュの追加・変更・削除
user = { name: "太郎", age: 20 }
user[:age] = 21 # 既存のキー → 値を変更
user[:email] = "taro@example.com" # 新しいキー → 追加
user.delete(:age) # キーごと削除
puts user.key?(:name) # true(キーがあるか)
p user.keys # [:name, :email]
p user.values # ["太郎", "taro@example.com"]👉 ハッシュ[キー] = 値 は、キーが既にあれば「変更」、なければ「追加」になります。キーの有無は key?(キー)、キーや値の一覧は keys / values で取り出せます。
7. each でハッシュを処理する
scores = { 国語: 80, 数学: 65, 英語: 90 }
scores.each do |subject, score|
puts "#{subject}: #{score}点"
end
# 国語: 80点
# 数学: 65点
# 英語: 90点👉 ハッシュを each で回すときは、|キー, 値| と2つの変数を受け取ります。配列のときは |要素| の1つだけだったのと比べてみてください。
8. 配列の中にハッシュを入れる
実際のプログラムでは、「ハッシュを配列に並べる」形がよく登場します。たとえば「複数人のユーザー情報」は次のように表せます。
users = [
{ name: "太郎", age: 20 },
{ name: "花子", age: 25 },
{ name: "次郎", age: 18 },
]
users.each do |u|
puts "#{u[:name]}さん #{u[:age]}歳"
end
# 太郎さん 20歳
# 花子さん 25歳
# 次郎さん 18歳💡 この「ハッシュの配列」は、データベースから取り出したデータや、JSONで受け取るデータとほぼ同じ形です。個別の値には users[0][:name] のように [ ] を重ねてアクセスします。
9. よく使うメソッド 早見表
配列
| メソッド | できること |
|---|---|
| length / size | 要素数を数える |
| include?(値) | 値が含まれるか(true / false) |
| push / << / pop | 末尾に追加 / 末尾を取り出して削除 |
| unshift / shift | 先頭に追加 / 先頭を取り出して削除 |
| first / last | 先頭の要素 / 末尾の要素 |
| join(",") | 要素を区切り文字でつないで文字列にする |
| sort / reverse | 並べ替え / 逆順にする |
| sum / min / max | 合計 / 最小 / 最大(数値の配列) |
ハッシュ
| メソッド | できること |
|---|---|
| keys / values | キーの一覧 / 値の一覧を取り出す |
| key?(キー) | キーが存在するか |
| fetch(キー, 初期値) | キーの値を取り出す(なければ初期値) |
| delete(キー) | キーと値のペアを削除する |
| each { |k, v| ... } | キーと値を1組ずつ処理する |
| size | ペアの数を数える |
10. まとめ
- 配列(Array)は
[ ]、ハッシュ(Hash)は{ }。Rubyでは別の型 - 配列は
[0]で取り出し、[-1]でうしろから数えられる。存在しない番号はnil - 追加は
<</push、削除はdelete/delete_at、要素数はlength - ハッシュのキーはシンボル(
:name)が定番。{ name: ... }と書いて[:name]で取り出す - 存在しないキーは
nil。fetch(キー, 初期値)で初期値を決められる - 繰り返しは
each。配列は|要素|、ハッシュは|キー, 値|
👉 「配列やハッシュを作る → each で回す → p で中身を確認する」の流れに慣れておくと、この先のデータ操作がぐっと分かりやすくなります。まずは小さな配列・ハッシュで、追加・取り出し・繰り返しを試してみましょう。