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

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

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

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

Q&A

解決済

4回答

22140閲覧

Ruby ハッシュのキーを変数で使いたい

RITA

総合スコア18

Ruby

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

0グッド

1クリップ

投稿2017/08/07 06:30

###前提・実現したいこと
Rubyの初心者です。

ハッシュのキーを変数で利用したいのですが、nilが帰ってきてしまいます。
R[:I]のように直接シンボルを書かずに、キーを変数で使いたいとき
どのようにすればいいのでしょうか。

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

=> nil

###該当のソースコード

Ruby

1R ={I:1, V:5, X:10} 2input =["I","V","X"] 3R[input[0]] 4

###試したこと
R ={I:1, V:5, X:10}
str = "I"
puts R[str]

変数をハッシュのキーとして利用できませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答4

0

シンボルと文字列は違うものです。

input =[:I, :V, :X]

とするか、

R[input[0].to_sym]

としてシンボルに変換するかしてください。

投稿2017/08/07 06:37

suzukis

総合スコア1449

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

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

0

次の irb での操作例は理解できますか?

ruby

1irb(main):001:0> h = {} 2=> {} 3irb(main):002:0> h[:A] = 1 4=> 1 5irb(main):003:0> h['A'] = 2 6=> 2 7irb(main):004:0> h 8=> {:A=>1, "A"=>2} 9 10irb(main):005:0> h.keys 11=> [:A, "A"] 12 13irb(main):006:0> 'A'.to_sym 14=> :A 15irb(main):007:0> :A.to_s 16=> "A"

4 行目に {:A=>1, "A"=>2} とあるように、 :A と "A" は別ものです。
6行目と7行目で :A と "A" の相互変換をしてみています。

下ではハッシュの初期値の書き方の例を示しています。 どう書いたら key が文字列となるのか、シンボルとなるのか を意識することは重要です。

ruby

1irb(main):001:0> {A: 1} 2=> {:A=>1} 3irb(main):002:0> {'A': 1} 4=> {:A=>1} 5irb(main):003:0> {'A' => 1} 6=> {"A"=>1} 7irb(main):004:0> {:A => 1} 8=> {:A=>1}

投稿2017/08/07 22:18

katoy

総合スコア22324

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

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

0

Rubyではハッシュのキーがシンボルか文字列か区別します。
記載のプログラムではキーをシンボルで宣言しているので、参照時もシンボルでアクセスすればよいです。

R ={I:1, V:5, X:10} input =["I","V","X"] R[input[0].to_sym]

逆に文字列でアクセスしたいなら

R ={"I"=>1, "V"=>5, "X"=>10}

投稿2017/08/07 06:38

編集2017/08/07 06:52
hellomartha

総合スコア329

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

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

maisumakun

2017/08/07 06:41

{"I":1, "V":5, "X":10}の書き方では、結局シンボルがキーのハッシュになります(文字列キーにしたければ、ハッシュロケットで書くしかありません)。
hellomartha

2017/08/07 06:51

おっしゃるとおりですね、失礼しました。修正させてもらいます
guest

0

ベストアンサー

このハッシュはシンボルがキーとなっていますので、キーを文字列で与えてもヒットしません。

文字列をキーにしたハッシュにしておきましょう(なお、大文字は定数なので、Rを小文字に変えています)。

ruby

1r ={'I' => 1, 'V' => 5, 'X' => 10} 2str = "I" 3puts r[str]

投稿2017/08/07 06:36

maisumakun

総合スコア145183

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

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

RITA

2017/08/07 06:47

ありがとうございます! 解決しました。 シンボルと文字列の表記の違いが理解できていませんでした。
otn

2017/08/07 07:19

> Rを小文字に変えています 再代入するわけじゃないので、定数で良いです。
bamboorian

2017/08/08 04:00 編集

katoyさんも記載してますが >直接シンボルを書かずに、キーを変数で使いたい と質問に書いてあるなら、シンボルでできることを示したほうがいいと思いました r ={I: 1, V: 5, X: 10} sym = :I puts(r[sym])
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問