符號 Symbol

符號也是一個 Ruby 特有的資料型態,很多剛從別的程式語言進來的朋友,剛開始比較難習慣這樣的東西。連原本寫 ruby 的可能都不見得解釋得清楚,但我會努力整理清楚我對這個資料的認知給大家。

命名及定義

  • 符號 = 有名字的物件
  • 命名規則類似變數,是以用英文字母或數字的組合
  • 例如:name, :class, :名字, :類別,要在中間加上空白也沒問題。但大多還是以英文字母的組合為主。

常跟字串搞混:

  • 字串可以被改變,符號不行
  • 兩者都是一種物件(值),都可以被變數指向
1
2
3
4
5
:name = "Sean" # 出錯
"name" = "Jack" # 出錯
name1 = 123 # 變數指向數字
name2 = "Jeff" # 變數指向字串
name3 = :Steve # 變數指向符號

實際使用

可能你會問,為什麼需要這樣的類型,那不是就用字串就好,但實際上這兩種類型效能有差別,符號執行的效能上比較好一些,我們會在 rails 開發中大量使用。

效能的比較可以透過查詢他的記憶體位置(.object_id)來得知,符號都是存在一樣的記憶體位置,第一次已經找到,第二次要用就直接從記憶體拿,而字串卻是每次呼叫都是不同的,所以符號會比較節省。

1
2
3
4
5
6
7
puts "hello".object_id # 印 720
puts "hello".object_id # 印 740
puts "hello".object_id # 印 760

puts :hello.object_id # 印 1920348
puts :hello.object_id # 印 1920348
puts :hello.object_id # 印 1920348

符號跟字串的轉換

  • 符號轉字串
    • to_sym
    • intern
    • %s
  • 字串轉符號
    • to_s
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#  to_sym 可把字串轉成 symbol
>> "Sean".to_sym
=> :Sean

# 和to_sym 是一樣的效果
>> "Jack".intern
=> :Jack

# 可用 %s 來做轉換
>> %s(name)
=> :name

# 用 to_s 方法可以把 symbol 轉成字串
>> :name.to_s
=> "name"

該選符號還是字串?

像這樣的問題,其實上面已經整理出答案瞜!

  • 不需要改變的 => 符號 (ex: hash 的 key)
  • 要改變的 => 字串 (ex: 印出一些名稱)

但也會視情況調整,像是符號就沒辦法使用許多好用的方法,字串就可以。

最普遍看到的符號就是在雜湊 (Hash) 的 key ,因為符號是不會被改變,且查找比較的速度快,會大量用在 hash 中。

1
2
# :name, :age都是Hash中的key
info = {:name=>"Sean", :age=>20}

以上就是我目前整理對於符號相關的重點,下一篇節我們就會討論 Hash 是甚麼喔,請大家好好期待一下!


參考資料:

  1. 為你自己學 Ruby on rails
  2. Ruby Docs - Symbol