Ruby Symbol object 因為和 String object 有某些相似的地方,因此滿常被拿來和 String object 比較,這篇就來介紹一下 Symbol object 以及和 String object 的一些比較。
Table of Contents
1. 宣告 Ruby Symbol Object
和 Integer object, Float object 一樣,Symbol object 無法用 class.new 的方式宣告,可以用直接賦值的方式 ( 在想宣告的名字前面加上: ) 宣告:
sym1 = :name
p sym1
# :name
p sym1.class
# Symbol
sym2 = :'name is Jimmy'
p sym2
# :"name is Jimmy"
p sym2.class
# Symbol
age = 25
sym3 = :"name is Jimmy #{age} years old"
p sym3
# :"name is Jimmy 25 years old"
p sym3.class
# Symbol
2. Symbol Methods
2.1 Symbol length/size
會回傳 Symbol 的長度:
sym = :name
p sym.length
# 4
p sym.size
# 4
2.2 Symbol []
可以用 .[] 來存取 Symbol 的 value,會以 String object 回傳:
sym = :name
p sym.[](0)
# "n"
p sym[0]
# "n"
p sym.[](0).class
# String
2.3 Symbol name
.name 會將 Symbol 以 String object 的形式回傳:
sym = :jimmy
p sym.name
# "jimmy"
p sym.name.class
# String
2.4 Symbol inspect
.inspect 會聯同 : 加上 name 以 String object 的形式回傳:
sym = :jimmy
p sym.inspect
# ":jimmy"
2.5 Symbol upcase
會將 Symbol 全部轉成大寫:
sym = :jimmy
p sym.upcase
# :JIMMY
2.6 Symbol downcase
會將 Symbol 全部轉成小寫:
sym = :JIMMY
p sym.downcase
# :jimmy
2.7 Symbol Capitalize
會將 Symbol 轉成第一個字大寫,其他小寫:
sym = :JIMMY
p sym.capitalize
# :Jimmy
2.8 Symbol to_s
將 Symbol 轉換成 String object:
sym = :jimmy
p sym.to_s
# "jimmy"
3. Ruby Symbol v.s. String
2.1 Immutable
Symbol 和 String object 不一樣的地方是 immutable,也就是賦值後不能改變:
str = "name"
sym = :name
p str[0]
# "n"
p sym[0]
# "n"
str[0] = "j"
sym[0] = "j"
# Error! undefined local variable or method `sym' for main:Object
2.2 記憶體位置
2.2.1 String
每當 new 一個 String object 時,Ruby 會宣告一個記憶體位置來存放這個 String object,即便 String object 的 value 一樣。
str1 = "jimmy"
str2 = "jimmy"
p str1.object_id
# 60
p str2.object_id
# 80
2.2.2 Symbol
因為 Symbol immutable 的特性,如果宣告兩個的 Symbol 是一樣的,那會指向同一個記憶體位置:
sym1 = :jimmy
sym2 = :jimmy
p sym1.object_id
# 1061148
p sym2.object_id
# 1061148
2.3 效能
因為 Symbol 上的 methods 比 String 少很多,因此宣告這兩個 object 時所佔的記憶體空間也有差:
require 'objspace'
str = "name"
sym = :name
p str.methods.length
# 183
p sym.methods.length
# 87
p ObjectSpace.memsize_of(str)
# 40
p ObjectSpace.memsize_of(sym)
# 0
3. 參考資料
Learn to Code with Ruby
Ruby Symbols vs. Strings
Day07 – Ruby比一比: Symbol符號與String字串
Class: Symbol (Ruby 3.1.2)
如果覺得我的文章有幫助的話,歡迎幫我的粉專按讚哦~謝謝你!