iT邦幫忙

2022 iThome 鐵人賽

DAY 10
1
Modern Web

Ruby新手村的礦工日記系列 第 10

[ Day 10 ] Ruby 關於符號的一些事

  • 分享至 

  • xImage
  •  

上一篇已經稍微介紹過符號與字串的差別了,但是那才是剛開始。
本篇會在繼續告訴大家關於符號的小東西。

效能

直接開門見山的說了,字串的效能要比符號來的差一點。
那要怎麼驗證呢?我們可以使用 object_id
當使用 object_id 去印出該物件在Ruby中唯一的數字編號。
但注意在不同的電腦或是 Ruby 版本會有不同的結果。

先來看 Symbol 會長出什麼出來:

5.times do 
  puts :hello.object_id
end

會產生5組一模一樣的數字。

1020188
1020188
1020188
1020188
1020188

而這些數字代表著什麼意義呢?
事實上它代表的是一個記憶體位址。
可以看到每次定義符號後,都會產生相同的數字,代表著這些 Symbol 其實都是同一個東西,並不會重新生一份新的出來,直接跟記憶體要就好了。
你就算要了100次,它只要跟記憶體拿100次同樣的東西就好,所以它可以省記憶體空間。

但字串就不一樣了,先來看會發生什麼事?

5.times do
  puts "hello".object_id
end

會產生五組不同的數字。

60
80
100
120
140

每次字串在生成一個新的字串時,他都會跟記憶體要一些空間。
假如你要了100次,記憶體就要吐100個空間給它。
所以你覺得誰的效能比較好呢?

freeze

其實我也可以使用freeze去將字串冷凍起來,效果會像這樣:

5.times do
  puts "hello".freeze.object_id
end
60
60
60
60
60

這樣就可以把ID固定住,並產生跟符號一樣的效果。

什麼符號與字串竟然可以互換

其實 Ruby 分別在字串與符號類別提供了一些轉換的方法。

字串換符號:

# 常見
p "kitty".to_sym    # => :kitty
# 少見
p "kitty".intern    # => :kitty
# 這也可以用
p %s(kitty)         # => :kitty

符號換字串:

# 常見
p :kitty.to_s        # => "kitty"
# 少見
p "kitty".id2name    # => "kitty"

符號與字串使用時機

這時候你應該會產生什麼時候用符號什麼時候用字串?的疑問。

符號

Hash 中的 Key

user = {name: "Kitty", age: 20, gender: "Female"}
p user    # => {:name=>"Kitty", :age=>20, :gender=>"Female"}

這時候就非常適合使用 Symbol ,我們可以利用它不可變的特性,以及它的效能又比字串來得好,查找跟比較也比字串快,很適合當作 Hash 中的 Key

字串

如果你的資料變更或是你只是想單純印出東西,那就可以使用字串
因為當你將 Symbol 輸出的時,它會先轉型成字串在輸出,所以效能就會差一點點。

字串有很多好用的功能, Symbol 類別就沒這麼豐富。

參考資料:

  1. 為你自己學Ruby on Rails
  2. Ruby 官方手冊

上一篇
[ Day 09 ] Ruby 充滿了符號
下一篇
[ Day 11 ] Ruby 使用一些方法吧
系列文
Ruby新手村的礦工日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言