Rubyのシンボル
最近「RailsによるアジャイルWebアプリケーション開発」を読みながらRailsのお勉強の最中。その中でシンボルについての説明を読んだだけだと必要性を感じなかったのですこし調べてみた。
シンボルと文字列との違い
簡単な例を乗せる。
a1="hoge" a2="hoge"
a1==a2 =>true a1.equal?(a2) =>false
となります。しかしシンボルだと
b1="hoge" b2="hoge"
b1==b2 =>true b1.equal?(b2) =>true
となります。
Rubyではすべてのオブジェクトはそれぞれのobject_idを持っているので、同じ文字列であっても異なるオブジェクトになってしまいます。しかしシンボルであれば同じオブジェクトを指します。文字列とobject_idが一対一に対応することによって文字列に対する処理を高速化しつつ、可読性を保つことができるのがシンボルの使い道(?)のようです。
実際にどれくらい高速化するのかのテスト(Ruby 1.9.2 Core i5 1.7HHz)
文字列の場合
100000000.times do a1="hoge" a2="hoge" a1==a2 end
32.32s user 0.06s system 100% cpu 32.372 total
シンボルの場合
100000000.times do b1=:hoge b2=:hoge b1==b2 end
12.06s user 0.02s system 100% cpu 12.073 total
と簡単な例ですが文字列の比較とシンボルの比較では確かににシンボルによって割り振られた整数での比較ができるので早いことが確認できました。