iT邦幫忙

2023 iThome 鐵人賽

DAY 20
0
自我挑戰組

自我挑戰Ruby系列 第 20

Day 20 - 符號

  • 分享至 

  • xImage
  •  

什麼是符號

在字元前面加上冒號(:),形成的型態就是符號,

其實我們可以想像,符號就是一個有名字的物件。

例如:

:hello

:name

符號的差異

(1)與變數的差異:變數通常是指定(=)在某個物件的名稱,

而符號指的就是某個物件(且這個物件還帶有一個名字)。

例如:

name = "Arance" 和 :name = "Arance"

當沒有指定name變數為Arance時,

印出name是沒有辦法的事。

但沒有指定:name符號為Arance時,

印出:name可以使用,但因為還沒指定會得到nil。

所以在沒有指定時,變數是不能單獨存在的。

(2)與字串的差異:大部分字串可以使用的方法,

符號都可以使用,符號本身的是不能修改的,因為符號就是一個有名字的物件。

例如:

"Arance"[0] = "B" 可以修改為B字母,

但:Arance[0] = "B”是沒辦法使用的。

效能

在效能上,每當產生一個新的字串就需要用一塊記憶體來存取,

然而如果使用符號,不會額外增加暫存記憶體的容量,

會直接在記憶體的部分將符號所存取的東西直接拿出來,

相對而言記憶體節省,而效能也比較好。

例如:

在Ruby裡面藉由object_id,可以得知物件的id,當使用

puts :Arance.object_id

無論重複印幾次,藉由符號所印出來的object_id均為相同。

但若使用puts "Arance".object_id

無論印多少次,字串所印出來的object_id會有所不同,

而會暫時一直減少可用記憶體的空間。

相互轉換

(1)字串轉符號:to_sym

例如: "Arance".to_sym 會得到 :Arance

而如果使用 .intern 和 用%s() 也是同樣的效果。

例如:"Arance".intern 或 %s(Arance)

(2)符號轉字串:to_s

例如: :Arance.to_s 會得到 "Arance"

而如果使用 .id2name 也是同樣的效果。

例如: :Arance.id2name 會得到 "Arance"

Day 20 結語

今天比較了符號以及字串的差別,而符號存在於雜湊(Hash)裡面的鍵(key)內。

相對來說的確字串的方法比較多,但符號比較可以節省記憶體的空間,

而也可以藉由字串以及符號的功能相互轉換。


上一篇
Day 19 - 雜湊
下一篇
Day 21 - 方法1
系列文
自我挑戰Ruby30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言