3日目のゴールとテーマ
3日目のテーマは「“たまるデータ”を扱う:配列でまとめて持つ」です。
1〜2日目で、1人分・複数人分の自己紹介を作れるようになりました。
今日はそこから一歩進めて、
複数人分の自己紹介を「あとでまとめて扱う」
配列(Array)という“並んだ箱”にデータを入れる
配列をぐるっと回して、一覧表示や簡単な集計をしてみる
ここまで行ければ、「Rubyでデータを扱う」感覚の入り口に立てます。
配列とは何かをイメージでつかむ
「同じ種類のものを順番に並べて持つ箱」
配列(Array)は、ざっくり言うと
「同じ種類のデータを、順番つきで並べて持つための箱」
です。
例えば、3人分の名前をバラバラの変数で持つとこうなります。
name1 = "たろう"
name2 = "はなこ"
name3 = "じろう"
Rubyこれでも動きますが、人数が増えると地獄です。
配列を使うと、こう書けます。
names = ["たろう", "はなこ", "じろう"]
Rubyこれで、「names という配列の中に、3つの名前が順番に入っている」状態になります。
Rubyの配列の基本操作
配列を作る
配列は [](角かっこ)で作ります。
numbers = [1, 2, 3, 4]
words = ["Ruby", "Python", "JavaScript"]
mixed = ["たろう", 25, "東京"]
RubyRubyの配列は、型が混ざっていても動きます。
ただし、初心者のうちは「同じ種類のものを入れる」意識を持っておくと整理しやすいです。
要素を取り出す(インデックス)
配列の中身は、0から始まる番号(インデックス)で取り出します。
names = ["たろう", "はなこ", "じろう"]
puts names[0] # たろう
puts names[1] # はなこ
puts names[2] # じろう
Rubyここでの重要ポイントは「最初の要素は names[0]」ということです。
0スタートは最初は違和感がありますが、すぐ慣れます。
要素を追加する(push / <<)
配列に新しい要素を足すには、push か << を使います。
names = []
names << "たろう"
names << "はなこ"
names.push("じろう")
Rubyこれで、names には3つの名前が順番に入ります。
自己紹介文を配列にためていく
2日目の build_introduction を再利用する
昨日作った「自己紹介文を1つ作って返す」メソッドを、もう一度使います。
def build_age_comment(age)
if age <= 0
"年齢はひみつなんですね。"
elsif age < 20
"とても若いですね!"
elsif age < 40
"働き盛りの世代ですね。"
else
"人生経験が豊富そうですね。"
end
end
def build_introduction
puts "あなたの名前を教えてください:"
name = gets.chomp
puts "あなたの年齢を教えてください:"
age_text = gets.chomp
age = age_text.to_i
puts "あなたの好きなこと(趣味)を教えてください:"
hobby = gets.chomp
age_comment = build_age_comment(age)
intro = ""
intro += "はじめまして、#{name}です。\n"
intro += "年齢は#{age}歳です。#{age_comment}\n"
intro += "好きなことは#{hobby}です。\n"
intro += "よろしくお願いします!\n"
return intro
end
Rubyこのメソッドは「1人分の自己紹介文(文字列)」を返してくれます。
これを配列にどんどん入れていきます。
配列に自己紹介文をためる
puts "何人分の自己紹介を作りますか?"
count_text = gets.chomp
count = count_text.to_i
introductions = []
i = 1
while i <= count
puts "========================"
puts "#{i}人目の自己紹介です。"
intro_text = build_introduction
introductions << intro_text
i += 1
end
Rubyここでの重要ポイントを深掘りします。
introductions = [] で「空の配列」を用意しているintro_text = build_introduction で、1人分の自己紹介文を作っているintroductions << intro_text で、その自己紹介文を配列の末尾に追加している
このループが終わったとき、introductions には
1人目の自己紹介文
2人目の自己紹介文
…
が順番に入っています。
配列にたまった自己紹介を「あとからまとめて表示する」
すぐ表示せず、あとで一覧表示する
さっきのコードでは、自己紹介文を作ったあとすぐには表示していません。
「いったん配列にためておいて、最後にまとめて表示する」形にします。
puts "========================"
puts "全員分の自己紹介をまとめて表示します。"
index = 0
while index < introductions.length
puts "------------------------"
puts "#{index + 1}人目の自己紹介:"
puts introductions[index]
index += 1
end
Rubyここでのポイントはこうです。
introductions.length は「配列の要素数」index を 0 から始めて、index < introductions.length の間ループintroductions[index] で、その人の自己紹介文を取り出して表示
このように、「配列にためる → あとでぐるっと回す」というパターンは、
アプリ開発でめちゃくちゃよく出てきます。
eachで「配列をぐるっと回す」Rubyらしい書き方
while ではなく each を使う
Rubyには、配列を回すためのもっと“Rubyっぽい”書き方があります。
それが each です。
さっきの while を、each で書き換えるとこうなります。
puts "========================"
puts "全員分の自己紹介をまとめて表示します。"
introductions.each_with_index do |intro_text, idx|
puts "------------------------"
puts "#{idx + 1}人目の自己紹介:"
puts intro_text
end
Rubyここでの重要ポイントを丁寧に見ていきます。
introductions.each_with_index do |intro_text, idx|
introductions の中身を先頭から順に取り出しながら、intro_text に要素、idx にインデックス(0,1,2…)が入る。
do から end までが「1要素ごとに実行される処理」
配列の要素の数だけ、このブロックが繰り返し実行される。
idx + 1 としているのは、「1人目、2人目…」と表示したいから。
Rubyに慣れてくると、while より each の方が
「配列を順番に処理している」ことが読み取りやすくなります。
3日目のミニアプリ:名簿っぽい自己紹介一覧
全体コードのイメージ
ここまでを1本にまとめると、こんな流れになります。
名前・年齢・趣味を聞いて、1人分の自己紹介文を作るメソッド(build_introduction)
年齢コメントを決めるメソッド(build_age_comment)
人数を聞く
人数分だけ build_introduction を呼んで、自己紹介文を配列にためる
最後に、配列を each で回して全員分の自己紹介を表示する
コードとしてはこうです。
def build_age_comment(age)
if age <= 0
"年齢はひみつなんですね。"
elsif age < 20
"とても若いですね!"
elsif age < 40
"働き盛りの世代ですね。"
else
"人生経験が豊富そうですね。"
end
end
def build_introduction
puts "あなたの名前を教えてください:"
name = gets.chomp
puts "あなたの年齢を教えてください:"
age_text = gets.chomp
age = age_text.to_i
puts "あなたの好きなこと(趣味)を教えてください:"
hobby = gets.chomp
age_comment = build_age_comment(age)
intro = ""
intro += "はじめまして、#{name}です。\n"
intro += "年齢は#{age}歳です。#{age_comment}\n"
intro += "好きなことは#{hobby}です。\n"
intro += "よろしくお願いします!\n"
return intro
end
puts "何人分の自己紹介を作りますか?"
count_text = gets.chomp
count = count_text.to_i
introductions = []
i = 1
while i <= count
puts "========================"
puts "#{i}人目の自己紹介です。"
intro_text = build_introduction
introductions << intro_text
i += 1
end
puts "========================"
puts "全員分の自己紹介をまとめて表示します。"
introductions.each_with_index do |intro_text, idx|
puts "------------------------"
puts "#{idx + 1}人目の自己紹介:"
puts intro_text
end
Rubyここまで動かせたら、「配列を使って複数データを扱う」感覚はかなりつかめています。
3日目のまとめ
今日のキーワードを整理します。
配列(Array)[] で作る「並んだ箱」。names[0] のようにインデックスで要素を取り出す。<< や push で末尾に追加できる。
length
配列の要素数。array.length で「いくつ入っているか」が分かる。
while と each
while は「条件が true の間、繰り返す」基本形。
each / each_with_index は「配列の要素を順番に処理する」Rubyらしい書き方。
「ためてから使う」
自己紹介文をすぐ表示するのではなく、
いったん配列にためておいて、あとでまとめて表示する。
これは、アプリでデータを扱うときの基本パターン。
次回(4日目)への予告
4日目は、今日の「自己紹介文(ただの文字列)」を一歩進めて、
1人分の情報を「ハッシュ」や「クラス」で表現する
「名前」「年齢」「趣味」を1つの“まとまり”として扱う
一覧表示のときに「名前だけ」「年齢だけ」を取り出す
といった、「データの構造化」に入っていきます。
