Symbol シンボル
- シンボルオブジェクトは
- コロン「:」で始まる文字列で表します
- 変更不可
- 同じ表記であれば同じオブジェクトID(全く同じオブジェクトが使いまわされるという事
:moko.object_id
=> 1158108
:moko.object_id
=> 1158108
:moko.equal?(:moko)
=> true
何でみんなそんなにシンボルが好きなの?
- Ruby内部では変数名やメソッド名等は整数値で管理されている(速度面で有利になるらしい)が、この整数値をコード上で表したものがシンボル
- 文字列や整数値が重要な訳ではないが名前を付けたい、ような時にどんどん使っていきまっしょい
GC
2.2でシンボルもGCの対象になった。これまでは使われたシンボルはいつまでも残っていた為、もし送信された文字列をシンボル化するシステムがあったとしたら、悪意を持つ人間が大量の文字列を送り込んでメモリの枯渇によりクラッシュの危険も・・みたいな怖い話だったらしい。
定義済みのSymbolオブジェクトを取得する
Symbol.all_symbols
=> 3[....] # 大量の配列が返ってくるので注意
シンボルを使ったり変数を定義したりすると内部で管理されているシンボルが増える
のを実感しよう
Symbol.all_symbols.size
=> 3518
:moko
=> :moko
Symbol.all_symbols.size
=> 3519 # 増えた!
hage = 1
=> 1
Symbol.all_symbols.size
=> 3520 # 増えた! 変数も内部ではシンボルで管理されている
Symbol.all_symbols.last(3)
=> [:irb_exit_org, :moko, :hage]
Symbolオブジェクトに対する文字列を取得する
to_s |
id2name |
:moko.to_s
=> "moko"
:hage.id2name
=> "hage"