🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Q&A

解決済

2回答

1033閲覧

Rubyでハッシュからeach文でうまく値を表示させる方法

yoshi751

総合スコア19

Ruby

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

0グッド

0クリップ

投稿2019/11/30 08:18

編集2019/11/30 08:19

##実現したいこと

ハッシュからeach文でうまく値を表示できるようにしたいです。

##問題点
現在、Rubyのクラスとインスタンスの練習で、Moive_reviewというクラスを作って
@moviesというhashのインスタンス変数を定義しています。
show_reviewというインスタンスメソッドで,
@moviesに投稿されたハッシュのデータを、うまく表示させたいのですが、できません。
keyとvalueがtitleと入力した値、starと入力した数字のようになってしまい。
each文の中で、タイトルとstarをputsのところにうまく表示するためには
どのようなコードに変えればいいのでしょうか?

##現在のコード

class Movie_review def initialize @movies={} end def post title=gets.chomp star=gets.to_i @movies[:title]=title @movies[:star]=star end def show_review @movies.each do |key,value| puts "タイトル#{key}" puts "五段階評価#{value}" end end end movie_review=Movie_review.new while true do puts "番号を入力してください\n1 投稿\n2 レビューを表示" input=gets.to_i if input==1 movie_review.post elsif input==2 movie_review.show_review else exit end end

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

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

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

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

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

guest

回答2

0

多分、あなたが欲しいのはハッシュじゃなくて、配列の配列なんじゃないかな

ruby

1def initialize 2 @movies = [] 3end 4 5def post 6 title=gets.chomp 7 star=gets.to_i 8 @movies << [title, star] 9end

別解

ruby

1# ハッシュでやる場合 2def post 3 title=gets.chomp 4 star=gets.to_i 5 @movies[title] = star 6end

ruby

1# ハッシュの配列でやる場合 2def initialize 3 @movies = [] 4end 5 6def post 7 title=gets.chomp 8 star=gets.to_i 9 @movies << {title: title, star: star} 10end 11 12def show_review 13 @movies.each do |movie| 14 puts "タイトル#{movie[:title]}" 15 puts "五段階評価#{movie[:star]}" 16 end 17end

投稿2019/11/30 09:16

編集2019/11/30 09:21
asm

総合スコア15149

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

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

yoshi751

2019/11/30 09:38

asmさん、回答ありがとうございます! 配列にした場合、適切に動作するようになりました! ハッシュで試して見たのですが、 Traceback (most recent call last): 3: from class.rb:34:in `<main>' 2: from class.rb:15:in `show_review' 1: from class.rb:15:in `each' class.rb:16:in `block in show_review': no implicit conversion of Symbol into Integer (TypeError) このようなエラーが出てしまいました。 このエラーの原因はどこかわかりますでしょうか? ``` class Movie_review def initialize @movies={} end def post title=gets.chomp star=gets.to_i @movies = {title:title,star:star} end def show_review p @movies @movies.each do |movie| puts "タイトル#{movie[:title]}" puts "五段階評価#{movie[:star]}" end end end movie_review=Movie_review.new while true do puts "番号を入力してください\n1 投稿\n2 レビューを表示" input=gets.to_i if input==1 movie_review.post elsif input==2 movie_review.show_review else exit end end ```
asm

2019/11/30 10:10

それだと、each使う必要ないですね def show_review puts "タイトル#{@movies[:title]}" puts "五段階評価#{@movies[:star]}" end でいいです。
guest

0

ベストアンサー

Hashでやるなら```
def post
title=gets.chomp
star=gets.to_i
@movies[title]=star
end

ですね、それでもともとの def show_review で表示できます。 >class.rb:16:in `block in show_review': no implicit conversion of Symbol into Integer (TypeError) のエラーがでたのは、`@movies.each do |movie|` を誤解しているからです Hashの each は each_pair とおなじです。 つまり、@movies.each do |key,value|` と同じ。 これを movie 一つで受けているので movieには [key,value] が入っています。配列です。 配列[:title]なので、シンボルは整数に出来ない というエラーとなります。

投稿2019/11/30 12:05

winterboum

総合スコア23567

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問