關於Ruby宇宙裡的Symbol
Published in
Aug 22, 2020
先說結論:Symbol(符號)的定義是
- 可以視為有名字的物件,或是一個值。
- 不是變數。
- 無法修改,具有唯一性 (ID) 。
- 可以當作是「無法修改的字串」。
在 Ruby 裡,大部分的東西都屬於物件,符號 、字串、變數、文字、數字、 nil …等都是物件的一種,除了 block 以外。
★Symbol寫法:
在字母與數字前有「冒號」,也可以使用空白字元,但必須用引號包起來。
:name
:title
: "Hello world" #使用空白字元
如果是字串,每一次印出都會重新生成id,容易佔記憶體。
puts "hello".object_id # 印出 70213995743900
puts "hello".object_id # 印出 70213995743760
puts "hello".object_id # 印出 70213995743700
puts "hello".object_id # 印出 70213995743640
puts "hello".object_id # 印出 70213995743580 #每呼叫一次,就跑出一個新ID呀.....◑ ω◑ 堪稱記憶體魔獸
但若是 symbol的狀況下,在Ruby宇宙裡,不管印出幾次,id都會是同一個。
#固定id
puts :hello.object_id # 印出 1055708
puts :hello.object_id # 印出 1055708
puts :hello.object_id # 印出 1055708
puts :hello.object_id # 印出 1055708
puts :hello.object_id # 印出 1055708
因為這樣的特性,symbol很適合拿來當作hash的key,因為指向記憶體的同一個位置。
如果想把symbol與字串作切換,可以用「.to_s」
p :name.to_s #印出 “name” #常見用法
p :name.id2name #印出 “name”
或者是字串轉成symbol,也是可以的
p “name”.to_sym # 印出 :name #常見用法
p “name”.intern # 印出 :name
★使用建議
如果你希望不變,那符號是你的不二選擇。
希望是可變的,字串適合你。