到Ruby世界不可不認識:符號
符號 Symbol
符號也是一個 Ruby 特有的資料型態,很多剛從別的程式語言進來的朋友,剛開始比較難習慣這樣的東西。連原本寫 ruby 的可能都不見得解釋得清楚,但我會努力整理清楚我對這個資料的認知給大家。
命名及定義
- 符號 = 有名字的物件
- 命名規則類似變數,是以用英文字母或數字的組合
- 例如
:name
,:class
,:名字
,:類別
,要在中間加上空白也沒問題。但大多還是以英文字母的組合為主。
常跟字串搞混:
- 字串可以被改變,符號不行
- 兩者都是一種物件(值),都可以被變數指向
1 | :name = "Sean" # 出錯 |
實際使用
可能你會問,為什麼需要這樣的類型,那不是就用字串就好,但實際上這兩種類型效能有差別,符號執行的效能上比較好一些,我們會在 rails 開發中大量使用。
效能的比較可以透過查詢他的記憶體位置(.object_id)來得知,符號都是存在一樣的記憶體位置,第一次已經找到,第二次要用就直接從記憶體拿,而字串卻是每次呼叫都是不同的,所以符號會比較節省。
1 | puts "hello".object_id # 印 720 |
符號跟字串的轉換
- 符號轉字串
- to_sym
- intern
- %s
- 字串轉符號
- to_s
1 | # to_sym 可把字串轉成 symbol |
該選符號還是字串?
像這樣的問題,其實上面已經整理出答案瞜!
- 不需要改變的 => 符號 (ex: hash 的 key)
- 要改變的 => 字串 (ex: 印出一些名稱)
但也會視情況調整,像是符號就沒辦法使用許多好用的方法,字串就可以。
最普遍看到的符號就是在雜湊 (Hash) 的 key ,因為符號是不會被改變,且查找比較的速度快,會大量用在 hash 中。
1 | # :name, :age都是Hash中的key |
以上就是我目前整理對於符號相關的重點,下一篇節我們就會討論 Hash 是甚麼喔,請大家好好期待一下!
參考資料:
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Sean's Blog!
評論
GiscusDisqus