最近Rubyについてきちんと勉強しようと思ってたのしいRubyを読んでたらシンボルが何かよくわからなかったのでメモ。
シンボルって?
調べたところ、シンボルとは
- ソース上では文字列として
- 内部では数値として扱われる
- シンボルと文字列は一対一に対応
- メソッド名やクラス名、変数名などはシンボルになる
大事な性質はこんな感じ
いろいろやってみる
シンボルの表示
作ったシンボルを表示してみる。
まず変数sym
にシンボル:foo
を入れる。
で、p
メソッドとputs
メソッドで表示してみる。
sym = :foo
p sym #=> :foo
puts sym #=> "foo"
うーん、普通に表示すると文字列として表示されるのか。
p
メソッドで表示するとシンボルとして表示される。
つまりソース上では文字列として振る舞うけど、実際はシンボルだよーということがわかる。説明が難しい…。
ついでに楽しいRubyにも載っていたto_s
とto_sym
メソッドも試してみた。
p sym.to_s #=> "foo"
p "foo".to_sym #=> :foo
なるほど。これはメソッドの説明通りそれぞれ文字列とシンボルオブジェクトに変わっている。
それにしてもto_s
はまだ使いそうだけどto_sym
って使うことあるのだろうか…(使用する例とかあったら是非教えてください!)
シンボルと文字列の違い
結局、これ、わざわざシンボル使わなくても文字列で良くない?って思っちゃうのでちょっと比較。
同じシンボルと文字列を作成してそれぞれのオブジェクトIDを比べてみる。
sym1 = :foo
sym2 = :foo
p sym1.object_id #=> 496340
p sym2.object_id #=> 496340
str1 = "foo"
str2 = "foo"
p str1.object_id #=> 32323284
p str2.object_id #=> 32323272
なるほど!シンボルでは結局同じ数値に変換されるから同じ名前のシンボルは同じ値、文字列は同じであっても違うオブジェクトとして認識されている。
要するにシンボルとは文字列の皮を被った数値なんですね!(言いたかっただけ)
終わりに
いろいろ自分で書いて実行してみてシンボルについての理解は深まったかな?と思う。
今後はしっかり文字列とシンボルをいい感じで使い分けていきたいなあ。