シンボルの意味について最低限知っておくべき3つのこと
☆ホッテントリメーカーより
「初めてのRuby」を読んでます。ようやく半分くらいか。Rubyの "シンボル" についてメモっとく。
以前、さらっとRubyの本を読んでから、Ruby on Railsで簡単なアプリケーションを開発(ってほどでもないけど)したことがあるんだけど、その時はRailsの本のチュートリアルの通りに作って、それを改良していく、って感じだったんだよね。だから細かいとこまではよく見てなくて、「へ〜Railsって簡単に作れるんだぁ」ぐらいにしか思ってなくて。で結局PHPのほうをまず覚えなきゃってんでPHPの勉強に移行したんだけど、ようやくPHPも基本的はことはできるようになったから、次のステップに進もうと思って選んだのが「Ruby」。RubyかJavaか迷ったんだけど、Rubyを覚えてからJava & JRubyあたりに入ろうかと思ってまずはRubyから。
シンボル
User.find(:all, :offset => 10, :limit => 10)
上記のRailsコードみたいに、「:all」とか「:offset」とかがいわゆる"シンボル"。最初は「文字列とどう違うの?表記が違うだけ?」とか漠然と思ってたんだけど、全然違うみたい。シンボルの特徴をまとめると、こんな感じ。
- 内容が同じ値であれば、同一オブジェクトである
- 変更不能である
- ハッシュのキーに適している
内容が同じ値であれば、同一オブジェクトである
文字列だと同じ値でも、異なるオブジェクトとして存在する。つまり、
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
ということができたけど、シンボルではこのようなオブジェクトの内容ごと入れ替えることができないってことかな。