前情提要:web
第六天咱們透過Ruby代碼練習public,protected和privatemethod時,發現冒號在前面的參數,:mydraft,:myspace,這些就是符號Symbol。在今天,咱們就來解釋Symbol吧!面試
Ruby經典面試題目#07
符號和字串有什麼不一樣?What’s difference between symbol and string?數據庫
還記得我以前IT邦文章在Ruby on Rails項目例子中研究ruby的gem套件時,我發現這二者寫法的功能是同樣的:數組
:image_directory => 'tingsimage'
功能跟下者同樣:ruby
image_directory: 'tingsimage'
:冒號在前面,意思是符號性能
冒號在後面:,意思是給值ui
當時的發現,也是造就本篇文章想進一步探討跑來跑去的小淘氣冒號的緣由。spa
比一比符號symbol字串string
意思有名字的符號物件指向字串物件的變數(leafor)
可不可變不可變immutable可變mutable
修改數組不可以使用[]=方法可以使用[]=方法修改字串
數組方法可以使用[]取得數組內的字元可以使用[]取得數組內的字元
字元方法可以使用.length .upcase .downcase可以使用.length .upcase .downcase
符號與字串轉換符號轉字串.to_s字串轉符號.to_sym
咱們來用代碼實驗看看:rest
tingsmessage =「This is my 7th article!」
tingsmessage這個變數,指向「This is my 7th article!」這個字串物件,變數的用意,就是讓個人字串物件能夠隨時作調整。(明天個人message跑馬燈就會換成第八天的招呼囉!)get
若是咱們把它變成::tingsmessage的符號呢?
它就會變成Symbol類別下的物件實體,名字叫作tingsmessage。
來用代碼實做:
:tingsmessage這個符號,名字有12個字元,名字的第1個字母是t(數組位置[0]表明第1個),第2個字母是i…以此類推:
p:tingsmessage.length #12
p:tingsmessage.upcase #TINGSMESSAGE
p:tingsmessage[0] #t
p:tingsmessage[1] #i
而tingsmessage這個天天都會變來變去的變數,所指向的字串,一共有23個字元:(不信你數數看!)
tingsmessage =「This is my 7th article!」
p tingsmessage.length #23
p tingsmessage.upcase #THIS IS MY 7TH ARTICLE!
p tingsmessage[0] #t
p tingsmessage[1] #h
身爲變數的好處就是能夠任意修改。咱們來試試改字母:
tingsmessage[1] =「Z」
p tingsmessage[1] #Z
p tingsmessage #TZis is my 7th article!
然而符號呢?
:tingsmessage[1]=「Z」
#undefined method `[]=' for:tingsmessage:Symbol(NoMethodError)
符號會找不到[]=方法修改字串。你能夠想像,符號就如同咱們在護照上的名字,是不能修改的。(由於已經被定義在國際間海關通用的數據庫了。)
符號的好處是專注,它被寫在程序裏固定的內存位置,因此提取性能較高。咱們能夠用object_id的方法來實驗:
3.times do
p:tingsmessage.object_id
end
印出結果:
1041308
1041308
1041308
而變來變去的變數每次都在內存裏面,搬家到不一樣位置:
3.times do
p「tingsmessage」.object_id
end
印出結果:
46936214509440
46936214509260
46936214509180
在前述比較表,符號和字串之間能夠互相轉換的。
p:tingsmessage #:tingsmessage
p:tingsmessage.to_s # tingsmessage前面的冒號已經不見了!
p tingsmessage # TZis is my 7th article!
p tingsmessage.to_sym #:TZis is my 7th article!前面多一個冒號
什麼時候使用符號Symbol
須要性能較高地傳遞參數時,例如在以前咱們使用rails創建項目,餐廳名字、電話等…,這些數據庫字段的名稱是固定不變的:
def restaurant_params
params.require(:restaurant).permit(:name,:address,:phone,:website,:image)
end
回到文初一開頭,我終於明白,
{:image_directory => 'tingsimage'}
實際上是符號Symbol用在Hash(外圍被大括號{}包着)裏,是變數給值=>的意思。
今天超級比一比,就到這裏結束啦(xcsjbj)!
比一比符號symbol字串string意思有名字的符號物件指向字串物件的變數可不可變不可變immutable可變mutable修改數組不可以使用[]=方法可以使用[]=方法修改字串數組方法可以使用[]取得數組內的字元可以使用[]取得數組內的字元字元方法可以使用.length .upcase .downcase可以使用.length .upcase .downcase符號與字串轉換符號轉字串.to_s字串轉符號.to_sym===