關於Ruby宇宙裡的Symbol

先說結論: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

★使用建議

如果你希望不變,那符號是你的不二選擇。
希望是可變的,字串適合你。

--

--

Jocelyn’s轉職工程師日誌
Jocelyn’s轉職工程師日誌

Published in Jocelyn’s轉職工程師日誌

上帝沒給你窗戶,你就自己做一個,然後把它打破逃出去。

Jocelyn LEE
Jocelyn LEE

Written by Jocelyn LEE

一名數位宅女,射手座。待過研究單位、美術館從事藝術推廣和藏品管理,主責過數位展示服務專案,目前正朝向把全端技能樹點滿的道路邁進。