質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

2404閲覧

Rubyでクラスとインスタンスを用いてコードを書き換えたいです。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

3クリップ

投稿2016/12/30 06:48

学校の課題で、クラスとインスタンスを使って現在のコードを書き換えたいのですが、途中まで考えてわからなかったので教えてほしいです。

ruby

1 2def post_review(a_posts) 3 4 post = {} 5 puts "ジャンルを入力してください" 6 post[:genre] = gets.chomp 7 puts "タイトルを入力してください" 8 post[:title] = gets.chomp 9 puts "感想を入力してください" 10 post[:review] = gets.chomp 11 line = "-------------------------------" 12 13 puts "ジャンル : #{post[:genre]}\n#{line}" 14 puts "タイトル : #{post[:title]}\n#{line}" 15 puts "感想 : \n#{post[:review]}\n#{line}" 16 17 18 a_posts << post 19 20 return a_posts 21 end 22 23def read_reviews(a_posts) 24 25 number = 0 26 a_posts.each do |post| 27 puts "[#{number}] : #{post[:title]}のレビュー" 28 number += 1 29 end 30 31 puts "\nみたいレビューの番号を入力してください :" 32 input = gets.to_i 33 34 35 post = a_posts[input] 36 37 38 line = "-------------------------------" 39 puts "ジャンル : #{post[:genre]}\n#{line}" 40 puts "タイトル : #{post[:title]}\n#{line}" 41 puts "感想 : \n #{post[:review]}\n#{line}" 42end 43 44def end_program 45 exit 46end 47 48def exception 49 puts "入力された値は無効な値です" 50end 51 52posts = [] 53 54while true do 55 56 puts "レビュー数 : #{posts.length}" 57 puts "[0]レビューを書く" 58 puts "[1]レビューを読む" 59 puts "[2]アプリを終了する" 60 input = gets.to_i 61 62 if input == 0 63 posts = post_review(posts) 64 elsif input == 1 65 read_reviews(posts) 66 elsif input == 2 67 end_program 68 else 69 exception 70 end 71end

途中まで考えたコードはこちらです。

ruby

1class Review 2 attr_accessor :genre, :title, :voice 3 @@post = [] 4 5 def self.input 6 puts "ジャンルを入力してください" 7 genre = gets.chomp 8 puts "タイトルを入力してください" 9 title = gets.chomp 10 puts "感想を入力してください" 11 voice = gets.chomp 12 line = "-------------------------------" 13 14 review = Review.new(genre, title, voice) 15 @@post << review 16 end 17 18 def initialize(genre, title, voice) 19 @genre = genre 20 @title = title 21 @voice = voice 22 end 23end 24 25Review.input 26

Rubyについてあまり理解できていないため、正解のコードを知って逆から理解していきたいとおもっています。
よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

賛否両論あるかもしれませんが、書き直してみました

ruby

1class Review 2 attr_accessor :genre, :title, :review 3 def initialize( genre:, title:, review:) 4 @genre = genre 5 @title = title 6 @review = review 7 end 8end 9 10module ReviewInterface 11 class << self 12 attr_accessor :reviews 13 def reviews 14 @reviews ||= [] 15 end 16 17 def post_review 18 puts "ジャンルを入力してください" 19 genre = gets.chomp 20 puts "タイトルを入力してください" 21 title = gets.chomp 22 puts "感想を入力してください" 23 review = gets.chomp 24 25 review = Review.new(genre: genre, title: title, review: review) 26 27 show_review(review) 28 29 reviews << review 30 end 31 32 def read_review 33 if reviews.empty? 34 puts "まだレビューがありません" 35 return 36 end 37 38 show_reviews 39 40 puts "\nみたいレビューの番号を入力してください :" 41 index = Integer(gets) 42 43 show_review(reviews[index]) 44 rescue 45 puts "不正な番号が指定されました" 46 end 47 48 def show_reviews 49 reviews.each_with_index do |review, i| 50 puts "[#{i}] : #{review.title}のレビュー" 51 end 52 end 53 54 def show_review(review) 55 line = "-------------------------------" 56 puts "ジャンル : #{review.genre}\n#{line}" 57 puts "タイトル : #{review.title}\n#{line}" 58 puts "感想 : \n #{review.review}\n#{line}" 59 end 60 61 def start 62 loop do 63 show_menu 64 65 input = Integer(gets) rescue -1 66 67 act_menu(input) 68 end 69 end 70 71 def show_menu 72 puts "レビュー数 : #{reviews.length}" 73 puts "[0]レビューを書く" 74 puts "[1]レビューを読む" 75 puts "[2]アプリを終了する" 76 end 77 78 def act_menu(input) 79 if input == 0 80 post_review 81 elsif input == 1 82 read_review 83 elsif input == 2 84 exit 85 else 86 puts "入力された値は無効な値です" 87 end 88 end 89 end 90end 91 92ReviewInterface.start

※エラー処理を少し追加してます

投稿2016/12/30 09:05

編集2016/12/30 15:38
satoshih

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/12/30 13:24

0のレビューを書くを実行すると下記のエラーが出てしまいます・・・。 27:in `post_review': undefined method `show_review' for ReviewInterface:Module (NoMethodError) これは27行目で48行目のインスタンスメソッドを呼び出しているから起こるものでしょうか・・・?
satoshih

2016/12/30 15:39

show_reviewのメソッドが抜けてました。すいません。 ソースは編集したので、再度コピーしてもらうと動くと思います
退会済みユーザー

退会済みユーザー

2016/12/30 23:59

ありあとうございます。 私の知らない表現がたくさんでてきていて、勉強になります! satoshihさんが作っていただいたコードを分析して、理解できるように励みます。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問