什麼是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: