Ruby | 2週間で身につく、アプリを作りながら学ぶRubyの基本 - 3日目

Ruby Ruby
スポンサーリンク

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, "東京"]
Ruby

Rubyの配列は、型が混ざっていても動きます。
ただし、初心者のうちは「同じ種類のものを入れる」意識を持っておくと整理しやすいです。

要素を取り出す(インデックス)

配列の中身は、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つの“まとまり”として扱う
一覧表示のときに「名前だけ」「年齢だけ」を取り出す

といった、「データの構造化」に入っていきます。

タイトルとURLをコピーしました