Ruby - Symbol
15 May 2020Symbol是帶有有名字的物件,寫法是前方有個冒號,在Ruby可以自由建立Symbol。
Symbol在記憶體的位置相同
每次要產生Symbol的object id時,都是去找同一個物件;在找string時,則是找不同的兩個物件:
- Symbol會有相同的object id
- String會有不同的object id
# Use .object_id to get the id (integer) of the object
puts :symbol.object_id #123424
puts :symbol.object_id #123424
puts "string".object_id #21938983
puts "string".object_id #21938829
# Use .freeze to fix the "string"
puts "string".freeze.object_id #21938935
puts "string".freeze.object_id #21938935
Symbol 效能 > String
Symbol效能比字串好,Symbol會直接比較是不是同一個物件;String則是一個一個字母逐一比對。
Symbol內容不可變,String內容可變
puts :symbol # symbol
puts "string" # string
puts :symbol[3] # b
puts "string"[3] # i
:symbol[3] = "u" # returnerror
"string"[3] = "u"
查詢Symbol
Symbol.all_symbols # return symbol table
Symbol無法當作變數
:symbol = "Hello, world" # return error
Symbol具有不可變且效能好的特性,經常作為辨識器使用:
- 方法
- 變數
- hash key
Ruby在2.2以後加入Symbol GC(Garbage collection),讓Symbol可以被回收,而不是堆積在記憶體。
References: