什麼是Symbol

很多程式語言裡並沒有symbol,它們只有字串。 而在這些語言中,字串都被用來作標識身份以及資料的儲存。

但在Ruby的世界中,將此分為獨立分出兩種類型 :

使用symbol作為標識身份,字串則用於處理資料。

Symbol are unique identifiers that are considered code, not data.

Symbol的組成

而在symbol的組成上是使用:,即在每個單字的前面加上:,也就是說symbol間是不能包含空格的。

但如果這個symbol的單字不只一個呢?

A symbol is created by adding a colon in front of a word.

知道:在左邊的是symbol,但在右邊的呢?

Hash 裡的 Key

這裡的 :name:age 就是 symbol。

因為 symbol 不可變(immutable)的特性,以及它的查找、比較的速度比字串還快,所以便很適合用來當 hash 的 key。

不可被當作變數使用

可以發現,symbol會找不到 =方法,也就無法被當作變數使用了。

Symbol are a special, limited variation of Strings.

immutable

使用object_id(*註1)方法檢查

如所看到的,即使創建的 3 個'Ruby'完全相同,但每個'Ruby'字串卻都具有不同的 object_id,這是因為它們實際上是不同的物件

Symbol與字串做轉換

即使前面提到symbol是immutable、不能被當做變數,但在Ruby世界裡,它還是可以轉換為字串,做那些symbol做不到的事。

有來有往,試試讓string也轉換為symbol

結論

字串來說在Ruby裡還是有較多內建方法可使用,但因為是可變的特性,所以每當要取用時,都要先去要一塊新的記憶體。

而只要是相同的symbol,就會有相同的object_id,表示這些 symbol 都是同一個物件,當 Ruby 第二次要取用同一個 symbol 的時候,它便會直接從記憶體裡拿,而不用重新產生一份,所以 symbol 相對的較節省記憶體

至於兩者的使用時機,或許可以參考大師Jim Weirich所提出的見解:

if the textual content of the object is important, use a String.

if the identity of the object is important, use a Symbol.

by Jim Weirich in 2007

*註1:object_id

object_id是個Ruby內建的方法,用於追蹤、查詢所有在Ruby世界裡飄散在各處的物件,並且是一種使用唯一ID標示每個物件的方法。

Reference:

為你自己學Ruby on Rails

Symbols | Ruby for Beginners

Ruby’s Symbols Explained