読者です 読者をやめる 読者になる 読者になる

シンボル

 Rubyの中でイマイチ分からないものがシンボルだったりします。Rubyの中では一番理解しにくい物でしょう。何せ1年くらいRubyゆるふわとやってますが、未だにどんな物かが分からないのですから←


 ということで、ちょっと調べてみました。ここらへんが良くまとめられてますね。
http://tech.x-neon.com/show/26
Rubyのシンボルは文字列の皮を被った整数だ! - hp12c

以下試してみた感じ

>> "abc" == "abc"
=> true
>> "abc".equal? "abc"
=> false
>> :abc == :abc
=> true
>> :abc.equal? :abc
=> true
>> :abc == "abc"
=> false
>> 

 Cでいう列挙と考えると良いらしいのですが、列挙を扱ったことないので...。

>> :abc.object_id
=> 201538
>> :abc.object_id
=> 201538
>> "abc".object_id
=> 1743050
>> "abc".object_id
=> 1740990

 こうするとシンボルだとidが変わらないのが分かりますね。


 でもってシンボルを使うとどう便利なのでしょうか?

def hoge(a)
  puts a[:foo]
  puts a[:bar]
end

i = {:foo => "01", :bar => "02"}
hoge(i)

def fuga(a)
  puts a["foo"]
  puts a["bar"]
end

j = {"foo" => "001", "bar" => "002"}
fuga(j)

実行結果は

01
02
001
002

ということでこの場合はあまり変わりない気がしますが...。

 うーん、どうすれば理解できるのだろうか,,,。
 attr_accessorとかmodule_functionで作法として扱うと、今は思ってるんですけどね。だれか上手い解説してくれませんか←