iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 28
0
Modern Web

Ruby on Rails面試題挑戰系列 第 28

Ruby on Rails面試題挑戰 Day28 - 字串(String)、符號(Symbol)、變數(Variable)的差異是什麼?

經過好幾天Rails面試題的洗禮,最後來回歸基本,挑一題Ruby相關的來挑戰吧!

what is the difference between String, Symbol and Variable?
字串、符號、變數的差異是什麼?


變數與字串比較常見,大家應該能容易理解,下面就簡單介紹

在Ruby中,變數就像是一個標籤,而這個標籤會貼在某個物件上,變數本身是沒有型態的。

譬如:

name = "柏毅"

name就是變數,而這個變數就像標籤,貼在"柏毅"這個字串(物件)上。

而字串就是用雙引號或單引號做出來的東西,如上面的範例,是String這個類別做出來的實體。

而大多數會比較難理解的是符號(Symbol),在Ruby或是Rails中很常看到前面加上冒號的寫法(:user、 :find_user),這就是符號。

符號可以想成是有專屬名字的物件,剛開始學的時候最不能理解的就是符號跟變數有什麼不同

符號 vs 變數

變數本身是標籤,因為本身沒有型態,是無法單純存在的,沒有指向任何東西的標籤是沒有意義的。

name

# => undefined local variable or method `name' for main:Object (NameError)

要使用變數必須要宣告他指向某個東西

# name變數指向123這個數字
name = 123

# name變數改成指向"hello world"這個字串
name = "hello world"

而符號是帶有名字的物件,是可以單純存在在Ruby的世界中的,符號本身有自己的名字,所以把它當作變數來指向某個物件是會出錯的。

# 不會噴錯
:name 

# 噴錯
:name = 123  #=> syntax error

變數本身沒有型態,並不是個物件,只是個指向某物件的標籤或名字而已。而符號本身是有專屬名字的物件。

符號 vs 字串

符號與字串有點類似,但其中的不同是,符號是不可以修改的,而字串可以。

#想將name第一個字母改成a

# 符號不能修改
:name[0] = "a" #=> undefined method `[]=' for :name:Symbol (NoMethodError)

# 字串可以修改
"name"[0] = "a" #=> a

而另一點不同是產生新的字串時,Ruby會去要新的記憶體位置,而符號並不會,利用object_id這個方法可以看出記憶體位置

# 符號指向同一塊記憶體位置
p :name.object_id #=> 88438
p :name.object_id #=> 88438
p :name.object_id #=> 88438

# 被認為是不同字串,被放在不同記憶體位置
p "name".objec_id #=> 47147339162260
p "name".objec_id #=> 47147339162020
p "name".objec_id #=> 47147339161820

:name記憶體位置都相同,表示是同一顆物件,而字串就不同了,即使字串的內容相同,也會被認定是不同的物件。

所以在效能上,符號的效能會略好一點,會在Hash中的key常常看到符號的出沒。

你可以這樣回答:

變數就像是一個標籤,而這個標籤會貼在某個物件上,變數本身是沒有型態的,並不是個物件,無法單純存活在Ruby世界中。

符號是有專屬名字的物件,前面以冒號:開頭,而字串也是個物件,以雙引號、單引號包覆,兩者的不同為,符號是不能修改的,而字串可以。

參考資料

1.為你自己學 Ruby on Rails - 符號(Symbol)


上一篇
Ruby on Rails面試題挑戰 Day27 - Rack是什麼?
下一篇
Ruby on Rails面試題挑戰 Day29 - 你喜歡Rails的什麼地方?
系列文
Ruby on Rails面試題挑戰30

尚未有邦友留言

立即登入留言