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

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

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

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

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

Q&A

解決済

2回答

2942閲覧

ハッシュオブジェクト(連想配列)を引数として扱う問題

Kei227

総合スコア44

Ruby

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

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

0グッド

0クリップ

投稿2015/11/15 04:29

編集2015/11/15 05:06

●問題
ある映画のハッシュを定義し、格納されている「title」(タイトル)・「genre」(ジャンル)・「year」(公開年)の三つの要素の中から一つを取り出すプログラムを作成してください。

●定義する変数
①movie = {"title" => "ハリーポッター", "genre" => "ファンタジー", "year" => "2001年"}
②ユーザーが入力するキーを、getsメソッドを利用し定義しましょう

●模範解答

lang

1def movie_info(movie, data) 2 puts "#{movie[data]}" 3 end 4 5 movie = {"title" => "ハリーポッター", "genre" => "ファンタジー", "year" => "2001年"} 6 7 puts "以下から一つを選んで入力してください。 8 ・title 9 ・genre 10 ・year" 11 12 info = gets.chomp 13 14 movie_info(movie, info)

模範解答ではハッシュのキーに文字列を利用していますが、私は以下のようにシンボルを利用して書きました。

lang

1def movie_select(movie, imput) 2 puts "#{movie[imput]}" 3end 4 5movie = {:title => "ハリーポッター", :genle => "ファンタジー", :year => "2001年"} 6 7puts "以下から一つを選んで入力してください。 8 ・title 9 ・genre 10 ・year" 11 12imput = gets.chomp 13 14movie_select(movie, imput)

この書き方だと、出力した際に

lang

1MBP-Kei:Desktop keita$ ruby sample.rb 2以下から一つを選んで入力してください。 3 ・title 4 ・genre 5 ・year 6title 7

と、最後の文が空白になってしまいます。

原因として
・メソッド内の#{movie[imput]の記述がおかしい
ということを検討したのですが、解決に至りませんでした。

ハッシュ内でシンボルオブジェクトを利用してこの問題解決に望む場合、メソッド内などではどのように記述してあげればいいのでしょうか?

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

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

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

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

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

argius

2015/11/15 05:03

Rubyタグの追加をお願いします。
guest

回答2

0

動作についての説明は otn さんの説明の通りです。

勝手ながら Kei227さんの回答コードをさらに、書き換えてみました。

ruby

1def movie_select(movie, key) 2 puts "#{key}: #{movie[key.to_sym]}" 3end 4 5movie = { 6 title: 'ハリーポッター', 7 genre: 'ファンタジー', 8 year: '2001年' 9}.freeze 10 11puts "以下から一つを選んで入力してください。 12 ・title 13 ・genre 14 ・year" 15 16key = gets.chomp 17 18movie_select(movie, key) 19 20# for test 21movie_select(movie, :title) 22movie_select(movie, 'title') 23movie_select(movie, 'genre') 24movie_select(movie, 'year') 25movie_select(movie, 'xxx')

最後の数行はテスト用です。
実行例:

$ ruby 3.rb 以下から一つを選んで入力してください。 ・title ・genre ・year year year: 2001年 title: ハリーポッター title: ハリーポッター genre: ファンタジー year: 2001年 xxx:

書き換えポイント:

  • movie_select() に文字列、シンボルのどちらを渡しても動作するようにした。
  • movie を変更できないようにした。
  • ハッシュの値の書き方を "key" => "val" でなく、 key: 'val' にした。

rubocop という ruby コードのチェックツールがあります。(web などで調べてみてください)
↑のコードは このツールでチェックさせても警告は出ません。

投稿2015/11/15 11:17

編集2015/11/16 12:12
katoy

総合スコア22324

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

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

Kei227

2015/11/15 12:19

movie_select() に文字列、シンボルのどちらを渡しても動作するようにした。 どこを変更することで上記が適応されたのでしょうか? また、ハッシュの書き方は『key: 'val'』のような書き方が簡潔でいいと思うのですが、この書き方をする上での注意点などはありますでしょうか?  
katoy

2015/11/15 12:33

def movie_select(movie, key) puts "#{key}: #{movie[key.to_sym]}" end の部分に注目してください。 movie[key.to_sym] としています。 key が "title" なら key.to_sym は :title になります。 key が :title なら key.to_sym .は :title そもままです。 ハッシュの書き方については http://qiita.com/YusukeHigaki/items/18db85aa9cba3cb42569 を参照してください。 rubocop では、 => 形式のハッシュ記法は警告が出ます。 (文字列を " で囲む記述も警告が出ます。 ' で囲むのが好ましいです。)
guest

0

ベストアンサー

:title"title"は異なりますので、movie["title"]は存在しません。
キーがシンボルなら、入力した文字列をシンボルに変換しないといけません。

Ruby

1input = gets.chomp.to_sym 2 3movie_select(movie, input)

投稿2015/11/15 04:54

otn

総合スコア84499

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問