メモ的な何か

技術的な私のメモになる予定です。

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"