上章提到符號特別的地方,
今天就以實際的例子比較三者之間的不同吧!
變數是一個指向某物件的名字,並不是物件,無法單獨存在。
name #錯誤訊息
name = "Ruby" #變數name指向字串"Ruby"
而符號是一個帶有名字的物件,可以單獨存在。
:name #程式執行正常
當然也就不能像變數一樣,把符號指向其他的物件。
:name = "Ruby" #錯誤訊息
因為符號本身就是有名字的物件,不能再被指向其他物件。
就像叫兔子不可能指鳥。
字串想要改其中一個字是可以的,但符號不行。
"abcd"[0] = "z" #字串變成"zbcd"
:abcd[0] = "z" #錯誤訊息
字串每次的記憶體位置是不固定的,而符號是同一個記憶體位置。
5.times do
puts "abcd".object_id
end
結果分別是:720 740 760 780 800
5.times do
puts :abcd.object_id
end
結果都是:1920348
*每個人電腦的記憶體位置顯示都會有差異喔!
我的例子是用Replit執行的結果。
程式在比較符號是否相同時,
是直接比對這物件的object_id是否相同,
但在比較字串時,
它是一個一個字母比對,
因此比較的時間會隨著字母的數量而增加。
結論:
如果你要快速、固定的物件,可以使用符號。
如果你要可變動性比較強,功能比較多時,可以使用字串。
而兩者也可以使用.to_sym、.to_s等方法互換喔!
Ruby
symbol
字串
變數