チェリー本 5章 その2

シンボル

シンボルを表すクラス
文字列の代わりに用いることもできますが必ずしも文字列と同じ振る舞いをするわけでない。
シンボルは:をつけて名前を定義する。

:シンボルの名前

#シンボル作成例
:apple
:japan
:ruby

シンボルと文字列の違い

ここからシンボルと文字列の違いを記載していく
シンボルはSymbolkクラスのオブジェクトで
文字列はStringクラスのオブジェクト

p :apple.class
p "apple".class

=>
Symbol
String

シンボルはrubyの中では整数として管理されている。
表面上は同じように見えるがその中身は整数
そのため2つの値が同じか調べるときは文字列より高速に処理できる。

#文字列より高速に処理でいる
:apple == :apple
"apple" == "apple"

またシンボルは同じシンボルであれば同じオブジェクトである
という特徴から大量の文字列と大量のシンボルを作成した場合だとシンボルの方がメモリー効率がよくなる。

p :apple.object_id
p :apple.object_id
p :apple.object_id
=>
1042908
1042908
1042908

p "apple".object_id
p "apple".object_id
p "apple".object_id
=>
60
80
100

シンボルでは同じオブジェクトに対して
文字列の場合だとオブジェクトは3つ全て異なる。

シンボルはイミュータブルなオブジェクトです。

ミュータブルとは「変更可能な」という意味で、反対にイミュータブルとは「変更できない」という意味
ミュータブルなオブジェクトは破壊的な変更が適用できるため、場合によっては本来変わってほしくない値まで一緒に変わってしまう恐れがある

シンボルは 何か名前をつけたい。名前なので誰かによって勝手に変更されたら困という時に使える。

#文字列は破壊的な変更が可能
string = "apple"
string.upcase!
p string
=>
"apple"

#シンボルはイミュータブルなので,破壊的な変更ができない
symbol = :apple
symbol.upcase!

シンボルの主な特徴

  • 表面上は文字列っぽい為、プログラマーが理解しやすい
  • 内部的には整数と同じ扱いなのでコンピューターが高速に値を比較できる。
  • 同じシンボルは同じオブジェクトのためメモリーの使用効率がいい。
  • イミュータブルの為、勝手に値を変えられることがない

代表的な使用例として
ハッシュのキーで使われる。
文字列よりハッシュで記載したほうが高速に取り出せる

cur = { "japan" => "yen", "us" => "dollar", "india" => "rupee" }
p cur["japan"]
=>
"yen"

#シンボルで記載した方が処理が早い
cur = { :japan => "yen", :us => "dollar", :india => "rupee" }
p cur[:japan]
=>
"yen"