ruby學習筆記(11)–symbol與hash參數

來源:互聯網
上載者:User

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)--文法層面的先見之明"),個人覺得雜湊參數其實更靈活

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.