【Ruby 學習筆記 — 03】符號(Symbol)
這個學習筆記系列作為我自己學習 Ruby 過程中筆記整理,Main purpose 是提供自己將來隨時 refer,而不是一個教程系列,加上本身有其他語言經驗因此很多概念和名詞不會多作解釋,因此不適合沒有任何程式基礎的讀者。Happy Coding !
符號 (Symbol)
在 ruby 中還有一個和字串相當類似的存在,Symbols
我們用 Symbols 表示「名字(name)」,其實是個不太容易理解的東西。
Symbol的寫法是在字串前加上冒號(:),如果要使用空白字元字串則要加上引號,如下所示
:mySymbol
:"This is a symbol"
與字串 (String) 的區別
Symbol 和 String 是相當類似的東西,主要則有以下區別
- 記憶體
a = :mySymbol
b = :mySymbol
c = :mySymbolp a.object_id # 1674908
p b.object_id # 1674908
p c.object_id # 1674908d = "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
可讀性也更佳。