パンプキンスパイスラテ

IT系のことが多めの日記帳です

シンボルの意味について最低限知っておくべき3つのこと

ホッテントリメーカーより
「初めてのRuby」を読んでます。ようやく半分くらいか。Rubyの "シンボル" についてメモっとく。
以前、さらっとRubyの本を読んでから、Ruby on Railsで簡単なアプリケーションを開発(ってほどでもないけど)したことがあるんだけど、その時はRailsの本のチュートリアルの通りに作って、それを改良していく、って感じだったんだよね。だから細かいとこまではよく見てなくて、「へ〜Railsって簡単に作れるんだぁ」ぐらいにしか思ってなくて。で結局PHPのほうをまず覚えなきゃってんでPHPの勉強に移行したんだけど、ようやくPHPも基本的はことはできるようになったから、次のステップに進もうと思って選んだのが「Ruby」。RubyJavaか迷ったんだけど、Rubyを覚えてからJava & JRubyあたりに入ろうかと思ってまずはRubyから。

「初めてのRuby」いいね。わかりやすい。

他の本で読んで、Rubyのことはなんとなくは把握してるつもりだったけど、これ読んで改めてRubyって面白いと思ったよ。これは覚えたい!

シンボル

User.find(:all, :offset => 10, :limit => 10)

上記のRailsコードみたいに、「:all」とか「:offset」とかがいわゆる"シンボル"。最初は「文字列とどう違うの?表記が違うだけ?」とか漠然と思ってたんだけど、全然違うみたい。シンボルの特徴をまとめると、こんな感じ。

  1. 内容が同じ値であれば、同一オブジェクトである
  2. 変更不能である
  3. ハッシュのキーに適している

内容が同じ値であれば、同一オブジェクトである

文字列だと同じ値でも、異なるオブジェクトとして存在する。つまり、

str1 = "ruby"
str2 = "ruby"
str1 == str2      #=> true
str.equal? str2   #=> false

「.equal?」がオブジェクトとして同一かどうかを判断するメソッド。
それが、シンボルだと、

str1 = :ruby
str2 = :ruby
str1 == str2      #=> true
str1.equal? str2   #=> true

となって、オブジェクトとしても同一だよ〜と結果が返ってくる。シンボルだとオブジェクトとして同一かどうかだけを調べればよいので、文字列同士に比べて、高速に同一性を判定できるらしい(初めてのRubyより)

変更不能である

シンボルは文字列とは異なり、内容の変更はできない。つまり、文字列では、

str = "hoge"
p str            #=> hoge
str << "huga"
p str            #=> hogehuga

ということができたけど、シンボルではこのようなオブジェクトの内容ごと入れ替えることができないってことかな。

ハッシュのキーに適している

だからこそ、シンボルはハッシュのキーに適している。キーの値は、内容が同じであれば同一であってほしいから。だからRailsでは通常ハッシュのキーにはシンボルを使ってたんだ。このシンボルって考え、Rubyだけなのかな?

おまけ

Ruby1.9ではこんな書き方もできるらしい。

:select => "name"  #=> Ruby1.8
↓↓↓↓↓↓↓
select: "name"     #=> Ruby1.9