初学者によるプログラミングMemo #5-2 実行順序・配列


はじめに

今回はスクールの後輩受講生(コピペ星人)から解説を頼まれた時のことを元に、同じ悩みがある人の一助になればと思い、記述します(後編)
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

目次

  • 第1章〜第3章 =>前回
  • 第4章 eachって何?
  • 第5章 レビューが表示される仕組みがかわからない

コードのおさらい

# メソッドの定義
def movie_review(a_movies)
  # 変数の定義
  movie = {}
  puts "ジャンルを入力してください:"
  movie[:genre]  = gets.chomp
  puts "タイトルを入力してください:"
  movie[:title]  = gets.chomp
  puts "感想を入力してください:"
  movie[:review] = gets.chomp
  line   = "---------------------------"

  # レビューの描画
  puts "ジャンル : #{movie[:genre]}\n#{line}"
  puts "タイトル : #{movie[:title]}\n#{line}"
  puts "感想 :\n#{movie[:review]}\n#{line}"

  # 配列オブジェクトに追加
  a_movies << movie

  # a_moviesをメソッドの呼び出し元に返す
  return a_movies
end

def read_reviews(a_movies)
  # リストの表示
  number = 0
  a_movies.each do |movie|
    puts "[#{number + 1}]:#{movie[:title]}のレビュー"
    number += 1
  end

  puts "\n見たいレビューの番号を入力してください:"
  input = gets.to_i - 1

  # レビューの取得
  movie = a_movies[input]

  # レビューの描画
  line   = "---------------------------"
  puts "ジャンル : #{movie[:genre]}\n#{line}"
  puts "タイトル : #{movie[:title]}\n#{line}"
  puts "感想 :\n#{movie[:review]}\n#{line}"
end

movies = []             # 配列オブジェクトmoviesの生成

while true do
  # メニューの表示
  puts "レビュー数:#{movies.length}"
  puts "[0]レビューを書く"
  puts "[1]レビューを読む"
  puts "[2]終了する"
  input = gets.to_i

  if input == 0
    movies = movie_review(movies)  # movie_reviewメソッドの呼び出し
  elsif input == 1
    read_reviews(movies) # read_reviewsメソッドの呼び出し
  elsif input == 2
    exit
  else
    puts "入力された値は無効な値です"
  end
end

第4章 eachって何?

さて、次はレビューの表示(メソッド:read_reviews(a_movies))ですが、また問題が発生しました
"each"文(メソッド)がわからない様です

each文の使い方は "配列名.each do |変数|"

使い方は上記の通りです
ここでの"read_reviews(a_movies)"の仮引数"a_movies"は、前回登場した"movie_review(a_movies)"の"a_movies"とは別であることに注意してください
何をしているかというと、配列に入っているものを順番に取り出しています
全て取り出し終わるまでこの作業は繰り返されます
変数には"movie"を使用しています
これは、配列オブジェクト"a_movies"にはハッシュオブジェクト"movie"が入っているからです
terminalへの表示は" puts "[#{number + 1}]:#{movie[:title]}のレビュー" "の部分で行なっています
"#{}"は前々回でやりましたのでそちらを参考に
"movie[:title]"ですが、前回"movie"というハッシュオブジェクトには、3つのキー":genre","title","review"を使ってデータを格納していました
ここではその中の"title"というキーを使って、格納されたデータを呼び出しています

上の画像では、MIFと万引き家族とアナと雪の女王のレビュー(movie)が配列オブジェクト(a_movies)に格納されており、ハッシュオブジェクト(movie)に格納されたデータのうち、[:title](キー)を表示する様にプログラムしています

第5章 レビューが表示される仕組みがかわからない

ここまでくればあとはレビューの表示だけです
terminalに何かを表示させる場合は"puts"メソッドを使うんでしたよね
ということで、"# レビューの描画"とある下の"puts"以下が、表示している部分となります
が、その前に、どのレビューを表示させるか決めなくてはなりません
そこでまた、"gets"メソッドを使って何番目を表示させるかを入力しましょう

input = gets.to_i - 1

先に"- 1"の解説だけします
先ほどのeach文のところでは触れませんでしたが、"#{number + 1}"というのがあります

「[0]"title"のレビュー」と表示されるより、「[1]"title"のレビュー」と表示させた方が、よりそれっぽいですよね
なので、表示は"#{number + 1}"で「[1]"title"のレビュー」と表示させています
プログラムでの配列オブジェクトの先頭の番号は"1"ではなく"0"になりますので、実際の配列の番号は"- 1"をして元に戻しています
ややこしい人は、"#{number + 1}"の"+ 1"と"gets.to_i - 1"の"- 1"を消してあげれば、「[0]"title"のレビュー」と表示されますが、結果は同じになります
これでinputの中身の定義ができました
次は、どのレビューを表示させるかを定義します

配列オブジェクトの中身の何番目かを選ぶ

movie = a_movies[input]

"input"には先ほど入力した数字が入ります
これで、配列オブジェクト"a_movies"の中の何番目のハッシュオブジェクトを選択するかが決まり、それを「キー」を使いたいので、"movie"に代入します

レビュー表示

もうここまでくれば下のプログラムの文章の解説はいらないと思います

puts "ジャンル : #{movie[:genre]}\n#{line}"

"movie[:genre]"の部分は"movie[:title]"として先ほどやりました
"\n"は「改行」を表しています
"#{line}"はその前で定義しています

結果としてはこうなります

まとめ

  • each文の使い方は "配列名.each do |変数|"
  • 配列オブジェクトは「0番目」から始まる
  • "配列[数字]"で配列オブジェクトの何番目の要素を取り出すかを指定できる