【Ruby 學習筆記 — 03】符號(Symbol)

寫在前頭

Kimika@小鳥
小鳥的隨筆生活
4 min readJan 12, 2019

--

這個學習筆記系列作為我自己學習 Ruby 過程中筆記整理,Main purpose 是提供自己將來隨時 refer,而不是一個教程系列,加上本身有其他語言經驗因此很多概念和名詞不會多作解釋,因此不適合沒有任何程式基礎的讀者。Happy Coding !

符號 (Symbol)

在 ruby 中還有一個和字串相當類似的存在,Symbols
我們用 Symbols 表示「名字(name)」,其實是個不太容易理解的東西。

Symbol的寫法是在字串前加上冒號(:),如果要使用空白字元字串則要加上引號,如下所示

:mySymbol
:"This is a symbol"

與字串 (String) 的區別

Symbol 和 String 是相當類似的東西,主要則有以下區別

  1. 記憶體
a = :mySymbol
b = :mySymbol
c = :mySymbol
p a.object_id # 1674908
p b.object_id # 1674908
p c.object_id # 1674908
d = "my string"
e = "my string"
f = "my string"
p d.object_id # 46992019585080
p e.object_id # 46992019585040
p f.object_id # 46992019585020

觀察 object_id 可發現 :
相同的 Symbol 不會創建好幾份,只有在第一次建立時會取一塊記憶體,之後都指向同一個記憶體位置。
每次創建相同的 String 則都會產生一份新的,建立幾個在記憶體中就有幾個。

利用 Symbol 可減少記憶體消耗

2. mutable vs. immutable

String是 mutable (可修改) 的,Symbol則否

a = :mySymbol
b = "myString"
a[0] = "0" # undefined method `[]='
b[0] = "0" # b == "0yString"

3. 方法

Symbol 無法使用很多 String 的方法,因此如果要使用 String的方法只能先用 to_s 轉成字串。

4. 效能

Symbol 處理速度大體上比 String 快。

使用場合 (Use Case)

Hash keys

通常使用 Symbol 作為 Hash的 key,特別得益於它比對速度比 String 快。

若建立 Hash 時使用類似 json 物件的寫法,key 會自動以 Symbol 產生。

myHash = {name:'kimika',id:123}myhash           # {:name=>"kimika", :id=>123}myHash[:name]    # kimika

狀態

在表示一個物件的狀態的時候也適合使用 Symbol 。
假設有一個遊戲,玩家(player)可能有很多狀態,不使用 Symbol 我們可能會直接用數字表示 :

if player.status == 1
# do something
elsif player.status == 2
# do something
else
# do something
end

這樣做我們還要記下每個數字代表的狀態,可讀性不是太好。

當然我們可以使用 String ,不過 ruby 提供我們 Symbol 這個不消耗多餘記憶體的方案,尤其我們的 player 很可能有很多個。

使用 Symbol 的寫法 :

if player.status == :poison
# do something
elsif player.status == :sleep
# do something
else
# do something
end

可讀性也更佳。

--

--