symbol是啥就不深入的討論了,只簡單說說symbol的好處
ruby內部對於每個對象,都會有一個數字id用來標識並區分,可以用xxx.object_id來查看
puts "0001".object_idputs "0001".object_idputs "0001".object_idputs "0001".object_id
輸出結果類似如下:
32088750
32088730
32088710
32088690
可以發現即使是同樣內容的字串"0001",在ruby解譯器內部每次也都是當作不同的對象來處理的,這樣隨著字元中的調用次數增加,ruby解譯器的負擔不是越來越重,記憶體消耗越來越大?
有沒有一種方法,讓ruby在內部記錄一下,如果遇到相同內容的字串,就不用再產生新的String對象,而是直接取已經存在的對象返回呢?答案就是symbol
任何對象,只要在前面加個冒號(即":"),就能得到其對應的symbol,把上面的代碼改成:
puts :"0001".object_idputs :"0001".object_idputs :"0001".object_idputs :"0001".object_id
輸出結果類似如下:
155038
155038
155038
155038
比較一下剛才的輸出,會發現這次貌似四次調用,貌似全都共用了一個對象。
現在您大概能明白,為啥Ror的應用中,到處充斥著類似下面的調用:
link_to 'Show', :action => 'show', :id => product
這裡用:action而非action;用:id而非id的目的,就是上面提到的symbol的好處。
至於"=>"這個是什麼意思,也就是下面要講的雜湊參數:
先來看一下雜湊表(HashTable),這個跟c#中的沒什麼不同,基本上也就是一個"鍵-值"對的集合
products = {"0001"=>"手機","0002"=>"電腦"}puts products["0001"]
輸出結果:
手機
很好理解,不是麼?但是結合上面講的內容,如果以後多次用到 puts products["0001"],ruby內部會每次產生一個全新的"0001"字串對象,所以一般沒人這麼用,應該改成這樣:
products = {:"0001"=>"手機",:"0002"=>"電腦"}puts products[:"0001"]
雜湊參數指的其實就是在調用方法並傳入參數時,可以將一個雜湊表做為參數傳入
def my_method(p1,p2,options={}) puts p1 puts p2 options.each{|key,value| puts "#{key} is #{value}"}endmy_method("1","2",:title=>"標題",:id=>123)
參數定義中我們用options={}定義了一個空的hash集合,這樣在調用時,可以傳入任意的 xx=>yy,aa=>bb,11==>22... 參數,是不是很靈活?
輸出結果:
1
2
title is 標題
id is 123
讓我們寫得更"潮"一點,更ruby一點:
my_method "1" , "2" , :title=>"標題" , :id=>123
效果完全相同,這個寫法是不是跟link_to 'Show', :action => 'show', :id => product一樣時尚了
題外話:雜湊參數與選擇性參數還是有些不同的(選擇性參數參見"ruby學習筆記(3)--文法層面的先見之明"),個人覺得雜湊參數其實更靈活