符號也是一個 Ruby 特有的資料型態,很多剛從別的程式語言進來的朋友,剛開始比較難習慣這樣的東西。連原本寫 ruby 的可能都不見得解釋得清楚,但我會努力整理清楚我對這個資料的認知給大家。
:name
, :class
, :名字
, :類別
,要在中間加上空白也沒問題。但大多還是以英文字母的組合為主。常跟字串搞混:
- 字串可以被改變,符號不行
- 兩者都是一種物件(值),都可以被變數指向
:name = "Sean" # 出錯
"name" = "Jack" # 出錯
name1 = 123 # 變數指向數字
name2 = "Jeff" # 變數指向字串
name3 = :Steve # 變數指向符號
可能你會問,為什麼需要這樣的類型,那不是就用字串就好,但實際上這兩種類型效能有差別,符號執行的效能上比較好一些,我們會在 rails 開發中大量使用。
效能的比較可以透過查詢他的記憶體位置(.object_id)來得知,符號都是存在一樣的記憶體位置,第一次已經找到,第二次要用就直接從記憶體拿,而字串卻是每次呼叫都是不同的,所以符號會比較節省。
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 可把字串轉成 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 中。
# :name, :age都是Hash中的key
info = {:name=>"Sean", :age=>20}
以上就是目前整理對於符號相關的重點介紹,下一篇節我們就會討論 Hash 是甚麼喔,請大家好好期待一下!
參考資料: