RubyのHashとSymbolでハマったこと
事象
Thorのオプション機能を使ったときにハマりました。
コマンド入力のオプションで設定した内容はoptionsというHashクラスに入るのですが、以下がうまくいきませんでした。
p options[:a_key] # =>"a_value" hash.each do |key, value| case key when :a_key puts value # =>表示されない end end p optins # =>{"a_key"=>"a_value"}
結果
最後の1行でお気づきの方もいると思いますが、
結果から言うとoptionsはHashクラスではありませんでした。
私が勝手にHashクラスだと思いこんでいただけです。
p options.class # =>Thor::CoreExt::HashWithIndifferentAccess
SymbolとStringを区別せずに同一のキーとして扱うクラスらしい。(Railsとかでも提供がある)
eachメソッドのkeyにはSymbolではなくStringが入るためcase分岐しませんでした。
以下とかとすごく似て見えるけど違う。
というか引数に型(クラス)を意識しないRubyの特徴だから類似も含めて気をつけねば。
options = {"a_key" => "a_value"} p options # =>{"a_key"=>"a_value"} p options["a_key"] # =>"a_value" p options[:a_key] # =>nil options_symbol = {:a_key => "a_value"} p options_symbol # =>{:a_key=>"a_value"} p options_symbol["a_key"] # =>nil p options_symbol[:a_key] # =>"a_value"