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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

3回答

1561閲覧

rubyのハッシュについて

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

1グッド

1クリップ

投稿2016/12/29 01:54

こんにちは

getsメソッドでユーザからの入力を待って、ハッシュオブジェクトからvalueを引き出したいのですが、うまくいきません。どうしてでしょうか・・・?

正しい動作イメージとしては、ユーザがtitleと入力したら、「ほんのなまえ」という文字列をターミナルに出力したいです。

初心者の質問でごめんなさい。答えてくれる方が入ればよろしくお願いします。

ruby

1def book_info(book, date) 2 puts book[:date] 3end 4 5book = {:title => "ほんのなまえ", :genre => "じゃんる", :year => "しゅっぱんび"} 6 7puts "ひとつ選んで入力してください。" 8puts "・title" 9puts "・genre" 10puts "・year" 11 12information = gets.chomp 13 14book_info(book, information)
dddd_gond👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

book を引くための key は Symbol です。
キー入力されたものは String です。 book を String で引いているので、一致するものがなくて nil しかえられません。

以下の irb での操作と出力結果を理解できるでしょうか?

ruby

1$ irb 2irb(main):001:0> book = {:title => "ほんのなまえ", :genre => "じゃんる", :year => "しゅっぱんび"} 3=> {:title=>"ほんのなまえ", :genre=>"じゃんる", :year=>"しゅっぱんび"} 4irb(main):002:0> book[:title] 5=> "ほんのなまえ" 6irb(main):003:0> book['title'] 7=> nil 8irb(main):004:0> :title == 'title' 9=> false 10irb(main):005:0> :title.class 11=> Symbol 12irb(main):006:0> 'title'.class 13=> String 14irb(main):007:0> :'title'.class 15=> Symbol 16irb(main):008:0> s = 'title' 17=> "title" 18irb(main):009:0> s.to_sym 19=> :title 20irb(main):010:0> book[s.to_sym] 21=> "ほんのなまえ"

他の方からの回答にあるように、 String を Symbol に変換することが可能です。(to_sym メソッド)

参考

... 文字列に対応するシンボル値 Symbol を返します。 ...

投稿2016/12/29 11:42

編集2016/12/29 13:22
katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2016/12/29 11:49

gets.chompされたものは、文字列に変換されるのは知っていたのですが、bookを引くkeyがシンボルでないと一致するものがないというのは、まったく考えていませんでした! たとえば一箇所getsメソッドでないところを修正するとすればハッシュオブジェクトの中身のkeyを book = { "title" => "hogehoge" }とすれば上手く引けそうですね。 頭の中が整理されました。katoyさんありがとうございます!
katoy

2016/12/29 11:52

> ... book = { "title" => "hogehoge" }とすれば上手く引けそうですね。 ... そうです。 irb で確認してみるとよいと思います。
guest

0

余計なことかもしれませんが、念のため。
getsメソッドは引数に何も指定しない場合**\nを区切りとした文字列を返します。
また、chompメソッドは
文字列の末尾の改行文字を削除した文字列を返します。
そのため、質問者さんのプログラムのinformation = gets.chompでは何も入力されなかった場合
変数informationにnilが代入**されてしまうのでは。動作上問題がなければそれでかまわないのですが、nilが来てはおかしいのであれば、エラーの原因になりかねないので、チェックする必要があります。

Ruby

1def book_info(book, date) 2 puts book[date.to_sym] 3end 4 5book = {:title => "ほんのなまえ", :genre => "じゃんる", :year => "しゅっぱんび"} 6 7puts "ひとつ選んで入力してください。" 8puts "・title" 9puts "・genre" 10puts "・year" 11 12information = gets 13unless information.nil? 14 information = information.chomp 15 book_info(book, information) 16end

投稿2016/12/29 03:00

s8_chu

総合スコア14731

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

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

退会済みユーザー

退会済みユーザー

2016/12/29 11:50

なんと! nilが返ってきては困りますので例外処理が必要ということでしょうか?
otn

2016/12/29 12:33

それを言い出すと、「"title" "genre" "year" 以外が入力されたとき」も考えないといけない。
s8_chu

2016/12/29 12:50 編集

回答文で書いたように、nilかどうかを判定する必要があります。 確かにotnさんの言うとおり、考慮しだしたらきりがないですね。失礼しました。
退会済みユーザー

退会済みユーザー

2016/12/29 14:10

ハッシュオブジェクトの理解を深めるために、遊んでいただけなのでいろいろなご意見をみなさんからいただいて大変勉強になっております。 3つの選択肢以外が入力されたときに、エラー文を吐くような分岐にするには、1〜3の選択肢で数字のif文を作り、elseでエラー文をputsすると漏れがなくなりそうでよいとおもいました! nilに対してはs8さんの回答にあるようなunlessとboleanを組み合わせても(・∀・)イイ!!ですよね。
otn

2016/12/29 14:19

> 3つの選択肢以外が入力されたときに、エラー文を吐くような分岐にするには、 普通は、case ~ when ~ else ~ end を使います。
退会済みユーザー

退会済みユーザー

2016/12/29 14:21

そうなんですね! なぜif elsif elsif .. ではなく、case when when ..なのでしょうか??
otn

2016/12/29 14:29

シンプルだからです。比べてみれば一目瞭然。
s8_chu

2016/12/29 14:36

加えて言えば、caseのほうがifよりも速いです。
退会済みユーザー

退会済みユーザー

2016/12/29 14:38

早くてシンプルなんですね。 ありがとうございます!
guest

0

puts book[:date]

文字列変数名の前に:を付けてもシンボルにはなりません。これは:dateというシンボルです。

Ruby

1def book_info(book, date) 2 puts book[date.to_sym] 3end

と、シンボルに変換してください。

投稿2016/12/29 02:03

otn

総合スコア84491

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

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

退会済みユーザー

退会済みユーザー

2016/12/29 02:08

勉強になります!シンボルに変換し、無事valueを取得することができました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問