Ruby中的符號(symbol)是什麼?

Ruby中的符號(symbol)是什麼? 1
Ruby中的符號(symbol)是什麼?

符號是什麼?

符號就是一個”有名字物件” (an object with a name)

123是一個數字物件
“abc”是依字串物件
===> :hello就是一個符號物件

****符號不是變數,他就只是一個值

以下為例,假設設定變數和符號

number = 123 ==>這個可以運行
:number = 123 ==>這個會噴錯

Ruby中的符號(symbol)是什麼? 3
Ruby中的符號(symbol)是什麼?

噴錯的原因就在於,符號不是一個變數,如果今天:number可以運作,就代表 “”數字123 = 數字456″”是成立的

因此以下程式碼運作是可以的
“”number = :number”” ==> 這個是可以運作的,他等於 “”number = 123″” => “”變數 = 一個值””


字串跟符號的差別在哪?

字串內容可以修改,但是符號不行

real_name = “JackLee”
real_name[2] = “k”
p real_name會印出 => “KakkLee”

如果換成以下
fake_name = :JohnLee
fake_name [2] = “k”
會直接噴錯

Ruby中的符號(symbol)是什麼? 5
Ruby中的符號(symbol)是什麼?

****另外字串的效能會比符號差一點點

ruby有一個語法是object_id ==> 可以印出記憶體位子

1、現在把5個”同樣字串的object_id”,印出來看看,如下圖可以看出都是不同的位子

Ruby中的符號(symbol)是什麼? 7
Ruby中的符號(symbol)是什麼?

2、如果現在換成”五個同樣符號的object_id”試試看,看下圖可以發現都是同樣的位子

Ruby中的符號(symbol)是什麼? 9
Ruby中的符號(symbol)是什麼?

字串跟符號的記憶體差很多嗎?

早期還沒有修改的時候,字串的記憶體占比反而比符號還小,不過現今修改後,符號比字串的占比還有少一點點點點,差非常的小。

“”freeze.object_id語法”” ==> 此語法可以把字串的記憶體位子冰凍起來,讓同一個字串的ID都會是一樣的(冰起來後,此物件就會像符號一樣,不能再被修改)
ex: p “hello, world”.freeze.object_id


字串轉符號
p “name”.to_sym ==>變成 :name

符號轉字串
p “:name”.to_s ==> 變成name

使用字串還是符號?

不可變,選符號。可以變,選字串