Ruby のシンボル

この前、頂いた本で Rails の勉強をしているのだが、よく出てくるシンボルがいまいちよく分からない。

たとえば、Rails

  id = @params[:id]

とすると、パラメータ id の値が取れるけど

  id = @params["id"]

でも取れる。ということは 「:id」も「"id"」も同じかと思って

  p :id == "id"  # => false

となった。ここでもう一度、Rubyリファレンスマニュアルの Symbol を見てみると

リテラルでシンボルを表す場合、`:' の後には識別子、メソッド名・・・

と書いてある。そうか、:id は Symbol オブジェクトのリテラルだったんだな。だから String オブジェクトである「"id"」とは同じではないのはあたりまえだ。ということは to_s すると同じかと思い確かめてみた。

  p :id.to_s == "id"  # => true

予測どおり true になった。Symbol が中で持ってる文字列は、この場合は id になるのかも知れない。

ここで、もうひとつ。普通の Hash でシンボルを使ってみた。すると

  h = { :id => "value" }
  p h[:id]   # => value
  p h["id"]  # => nil

となって、"id"をキーにすると nil になる。

Rails で @param[:id] と @param["id"] で同じ値が取れるのは Rails がいろいろうまくやってくれてるからなのか?