プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Ruby、シンボルとは?
実はそんなに難しくもなさそうですが
突っ込んで見ておいた方が無難っぽいので
取り上げてみました。
Rubyさんに出てくる「シンボル」って奴。
こいつ、一体何者よ(--?

小難しい説明を見ると

「シンボルは任意の文字列と一対一に対応するオブジェクト」

とか書いてあります。
だからどーゆーことだってばYO!(-A-)

う~ん……つまり、こーゆーことかな(--?

a = "abc"

とかやると

「変数a」=「オブジェクトa」に「"abc"って文字列」が設定されますよ。

それと同時に

「文字列"abc"のシンボル」=「オブジェクト1」に「"abc"」が設定される

次に

b = "abc"

ってやると

「変数b」=「オブジェクトb」に「"abc"って文字列」が設定されますよ

それと同時に「文字列"abc"のシンボル」を作ろうと思ったけど
さっき作った「オブジェクト1」があるから作らなくていーや、
どーせ同じものだから一緒に使っちまえーとなる。

そんな状態なので値比較の演算子「==」で比較したときは
変数同士を比較しようとシンボルを比較しようと同じ結果。

変数a(オブジェクトa)の値:"abc"
変数b(オブジェクトb)の値:"abc"

だから「a == b」はtrue

同様に

変数aに設定された文字列"abc"のシンボル(オブジェクト1)の値:"abc"
変数bに設定された文字列"abc"のシンボル(オブジェクト1)の値:"abc"

だから

「:"#{a}" == :"#{b}"」もtrue
(変数aを式展開した値のシンボルと変数bを式展開した値のシンボルを比較)

一方、オブジェクト比較の演算子「equal?」を使った場合はどうなるか?

変数の方は

変数a(オブジェクトa)のオブジェクト:オブジェクトa
変数b(オブジェクトb)のオブジェクト:オブジェクトb

だから「a.equal?(b)」はfalseになる。

それに対してシンボルの方は

変数aに設定された文字列"abc"のシンボル(オブジェクト1)のオブジェクト:オブジェクト1
変数bに設定された文字列"abc"のシンボル(オブジェクト1)のオブジェクト:オブジェクト1

なので「:"#{a}".equal?(:"#{b}")」はtrueになる。

ちなみにこんなサンプルを作って動かしてみましたところφ(--)

  a = "abc"
  b = "abc"
  
  if a == b 
      puts 'a == b'
  end
  
  if :"#{a}" == :"#{b}" 
      puts '"#{a}" == :"#{b}"'
  end
  
  if a.equal?(b)
      puts 'a.equal?(b)'
  end
  
  if :"#{a}".equal?(:"#{b}")
      puts ':"#{a}".equal?(:"#{b}")'
  end
  
  puts a.object_id
  puts b.object_id
  puts :"#{a}".object_id
  puts :"#{b}".object_id


結果はこんな感じでしたφ(--)

a == b
"#{a}" == :"#{b}"
:"#{a}".equal?(:"#{b}")
20135532
(←変数の方はオブジェクトIDが違う)
20135484(←変数の方はオブジェクトIDが違う)
174632(←シンボルの方はオブジェクトIDが同じ)
174632(←シンボルの方はオブジェクトIDが同じ)


よっしゃ!多分理解した\(--)/

※補足
 厳密には変数a,b(オブジェクトa,b)に設定されるのは
 「"abc"って文字列」ではなく「"abc"って文字列のオブジェクトへの参照」
 っぽいですが、そこら辺までツッコんで書くとグダグダになりそうなので
 取りあえずは見なかったことにしています。
 「どーゆーことよ?」ってな方は「Ruby、変数へ代入する際の注意点」で
 補完してくださいm(__)m
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● Ruby  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事