在學習 Ruby on Rails 過程中,常在視圖模板(.rhtml)中看到類似 :action => "show" 的語法。冒號前綴的標識符究竟是什麼?為何不直接使用字串?本文深入探討 Ruby Symbol 的本質、記憶體優化機制與實際應用場景。
Ruby 標榜「一切皆物件」,連簡單字串也是 String 實例:
ruby -e 'puts "hello world".class'
# 輸出: String
ruby -e 'puts "hello world".object_id'
# 輸出: 41436168 (每次執行不同)
當 Hash 使用大量相同鍵值時,每個鍵都是獨立的 String 物件,造成記憶體浪費:
song1 = { 'title' => 'used to love you', 'artist' => 'john legend' }
song2 = { 'title' => 'i still', 'artist' => 'backstreet boys' }
# 'title' 在兩個 Hash 中佔用不同記憶體位址
Symbol 以冒號開頭(:action),屬於 Symbol 類別:
ruby -e 'puts :action.class'
# 輸出: Symbol
ruby -e 'puts :action'
# 輸出: action
核心優勢:相同內容的 Symbol 全程式僅存在一個實例,極大降低記憶體佔用。
| 特性 | String | Symbol |
|---|---|---|
| 記憶體 | 每次建立新物件 | 全域唯一,重複使用 |
| 可變性 | 可修改 | 不可變 (無賦值方法) |
| 方法支援 | 完整 String 方法 | 僅基本方法,需 to_s 轉字串 |
| 效能 | 較慢 | 比較極快 (物件身分比較) |
在 Rails 中大量用於:
{ :title => "Rails", :author => "DHH" }attr_reader :name 等同 attr_reader "name"link_to "Show", :action => "show", :id => 1當符合以下條件時,優先使用 Symbol:
capitalize、gsub)善用 Symbol 可顯著降低 Rails 應用的記憶體佔用並提升存取速度,是 Ruby 開發者必須掌握的核心概念。