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

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

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

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

Q&A

解決済

2回答

1193閲覧

ハッシュについての自分の理解

Toshi1645

総合スコア7

Ruby

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

0グッド

0クリップ

投稿2018/11/24 10:58

前提・実現したいこと

Rubyで簡単な辞書アプリを作る問題をネットで見つけてやってみたんですが、
初見ではあまりわからなかったので解答をみました。その解答コードが下のものです。

ここでいまいち理解できないのが
add_term(dictionary)メソッド内の最後の行

dictionary[ja_new_term] = en_new_term

という記述です。

dictionary[ja_new_term] の ja_new_term は
ユーザーが入力した情報を持った変数ですよね?
それを、ハッシュである dictionary の キーとして扱っているのでしょうか?
だとすれば疑問があります。

ハッシュのキーは [:key] という風に 『:』を先頭に持ってこなければならないと
習いました。
しかし、ユーザーが入力した値には『:』がつくとは限りません。

これは一体どういうことなのでしょうか?

教えてくださる方いらっしゃいましたら何卒よろしくお願いいたします。

発生している問題・エラーメッセージ

dictionary = {} def add_term(dictionary) en_new_term = {} puts "日本語の単語入力" ja_new_term = gets.chomp puts "品詞" en_new_term[:part_of_speech] = gets.chomp puts "英語の意味" en_new_term[:definition] = gets.chomp puts "例" en_new_term[:example] = gets.chomp dictionary[ja_new_term] = en_new_term end def look_for_term(dictionary) line = "_____________________" puts "英語を見たい日本語を入力" ja_term = gets.chomp the_term = dictionary[ja_term] puts line puts "品詞: #{the_term[:part_of_speech]}" puts line puts "意味: #{the_term[:definition]}" puts line puts "例題: #{the_term[:example]}" puts line end def show_all_terms(dictionary) line = "_____________________" dictionary.each do |ja_term, en_term| puts ja_term puts line puts "品詞: #{en_term[:part_of_speech]}" puts line puts "意味: #{en_term[:definition]}" puts line puts "例題: #{en_term[:example]}" puts line end end while true do puts "[0]新しい単語を追加\n[1]単語の意味を調べる\n[2]全てをリストする\n[3]アプリを閉じる" input = gets.to_i if input == 0 add_term(dictionary) elsif input == 1 look_for_term(dictionary) elsif input == 2 show_all_terms(dictionary) elsif input == 3 exit else puts "無効な数字" end end

該当のソースコード

Ruby

1 def add_term(dictionary) 2 en_new_term = {} 3 puts "日本語の単語入力" 4 ja_new_term = gets.chomp 5 puts "品詞" 6 en_new_term[:part_of_speech] = gets.chomp 7 puts "英語の意味" 8 en_new_term[:definition] = gets.chomp 9 puts "例" 10 en_new_term[:example] = gets.chomp 11 dictionary[ja_new_term] = en_new_term 12 end

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

Rubyのバージョンは 2.5.1 です。

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

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

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

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

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

guest

回答2

0

データと書法のありようを混同されているように見えます。:keyで実際にキーになるシンボルの名前はkeyであって:keyではないはずです。

投稿2018/11/24 11:34

KojiDoi

総合スコア13671

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

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

Toshi1645

2018/11/25 06:57

回答ありがとうございます。 dictionary[ja_new_term] = en_new_term の場合、 ja_new_term に値を入力 その後 dictionary[ja_new_term] という記述でもう『:』が入っちゃってるのと同じようなものということなんですかね?
guest

0

ベストアンサー

ハッシュのキーは [:key] という風に 『:』を先頭に持ってこなければならないと

習いました。

全くそんな事はありません。Rubyでは、シンボルだけでなく、文字列、数値、truefalsenil、クラス自体も含めて、多くの種類の値をキーに使うことができます。実際、複雑なデータを記録する際に、「配列をキーにしたハッシュ」も作ったことがあります。

キーには任意の種類のオブジェクトを用いることができますが、 以下の2つのメソッドが適切に定義してある必要があります。

Object#hash ハッシュの格納に用いられるハッシュ値の計算
Object#eql? キーの同一性判定
るりまより)

投稿2018/11/24 11:25

編集2018/11/24 11:27
maisumakun

総合スコア145183

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

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

Toshi1645

2018/11/25 07:01

回答ありがとうございます。 とてもわかりやすいです。 シンボルがなくてもいいんですね。 Rubyの理解が少し深まりました! 感謝します????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問