--- title: Symbol符號 tags: ruby, 5x, hw --- Ruby 世界裡的符號(Symbol) === `Symbol`符號是什麼?它跟字串又有什麼不同? # Symbol符號是什麼? ## 1. `Symbol`是有名字的物件(an object with name) 物件有很多種類,舉例而言: * `5` 是一個數字物件 * ``"倍"`` 是一個字串物件 * `:dimond` 是一個符號物件 ## 2. `Symbol` 不是`變數`,而是`值` 規則:變數放在等號左邊,值放在等號右邊 * `變數` = `值` name = "Ting Ting" * `:name = "Ting Ting"` 這樣的寫法是錯誤的!因為:name這個符號不是變數,而是值 * `name = :name` 正確 * `5 = "紅寶石數量"` 錯誤(值要放在等號右邊) **結論:Symbol不是變數,它就只是一個值(或者說,是一個物件)** # Symbol 與 String 的差別 ## 1. Symbal和String一樣,是Ruby的一種類別 假設我們有一個tingsmessage 這個字串變數,指向 “This is my second homework” 這個字串物件。 ```ruby tingsmessage = "This is my second homework" p tingsmessage # "this is my second homework“ ``` 變數的用意,就是讓我的字串物件可以隨時做調整。(就像昨天我的message可能其實是“This is my first homework”!) 但如果是:tingsmessage的這個符號呢? 它就會成為Symbol類別下的物件實體,名字叫做tingsmessage ```ruby p :tingsmessage # :tingsmessage ``` ## 2. Symbal值不能被修改 tingsmessag字串裡面的值可以輕易被修改 ```ruby tingsmessage = "This is my second homework" p tingsmessage # "this is my second homework“ p tingsmessage.length # 26 p tingsmessage.upcase # "THIS IS MY SECOND HOMEWORK" tingsmessage[0] # T tingsmessage[1] # h tingsmessage[0] = "t" #修改字串 p tingsmessage # "this is my second homework“ 開頭改為小寫 ``` Symbal`值不能被修改,會出現錯誤訊息!!!` ```ruby p :tingsmessage #:tingsmessage p :tingsmessage.length #12 p :tingsmessage.upcase #TINGSMESSAGE p :tingsmessage[0] #t p :tingsmessage[1] #i :tingsmessage[1]= "T" #undefined method `[]=' for :tingsmessage:Symbol (NoMethodError) ``` ## 3. Symbol只有一個Object id Symbal做比對運算時,會比字串更有效率。它被寫在程式裡固定的記憶體位置,所以提取效能較高。 ```ruby 3.times do p :tingsmessage.object_id end ``` 印出結果: ``` 1041308 1041308 1041308 ``` 字串的效能稍微差一點,因為每次執行時重新給Object id ``` 3.times do p "tingsmessage".object_id end ``` 印出結果: ``` 46936214509440 46936214509260 46936214509180 ``` 今天超級比一比,就到這裏結束啦! 比一比 | 符號 symbol | 字串 string ------------- | ------------- | ------------- 意思 | 有名字的`符號物件` | 指向`字串物件`的變數 可不可變 | 不可變 immutable | 可變 mutable 修改陣列 | 不可使用`[]=`方法 | 可使用`[]=`方法修改字串 陣列方法 | 可使用[] 取得陣列內的字元 | 可使用[] 取得陣列內的字元 字元方法 | 可使用.length .upcase .downcase | 可使用.l.length .upcase .downcase 符號與字串轉換 | 符號轉字串`.to_s` | 字串轉符號`.to_sym` 常用時機 | 用於不需改變值的情況,如Hash的key與value | 需要使用字串才有的方法(如:修改功能)