---
# System prepended metadata

title: Symbol符號
tags: [' 5x', ruby, ' hw']

---

---
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 | 需要使用字串才有的方法(如:修改功能)