Rubyの文字列とシンボルの比較でつまづいた

とあるgemパッケージを使ってた際につまづいた...

タイトルの通り,文字列とシンボルを比較するとfalseになって想定した動きをしてくれないところでつまづいた. 結果から言うと,パラメータの渡し方が悪かった(文字列を渡していた)ようでそれをシンボルに変換して渡せばうまくいった. また,シンボルについてよくわかっていなかったのでこれを機会に調べてみた.

シンボルとは

class Symbol (Ruby 2.0.0)

ドキュメントによると

シンボルは任意の文字列と一対一に対応するオブジェクト

シンボルは、ソース上では文字列のように見え、内部では整数として扱われる

だそう.

等値にしたい場合

等値にしたい場合は

  1. Stringクラスのto_symメソッド
  2. Symbolクラスのto_sメソッド

のどちらかを用いて文字列かシンボルに合わせて比較してやるとうまくいく.

以下は具体的なコード.

'hoge' == :hoge.to_s # シンボルを文字列に変換
#もしくは
'hoge'.to_sym == :hoge # 文字列をシンボルに変換