日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
全面解讀Rubysymbol

學(xué)習(xí)Ruby語言的朋友都知道,Ruby on rails是一個(gè)非常有利于數(shù)據(jù)庫開發(fā)的框架。在這里我們?yōu)榇蠹抑v解一下其中Ruby symbol的相關(guān)知識(shí)。#t#

創(chuàng)新互聯(lián)建站一直通過網(wǎng)站建設(shè)和網(wǎng)站營銷幫助企業(yè)獲得更多客戶資源。 以"深度挖掘,量身打造,注重實(shí)效"的一站式服務(wù),以成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、移動(dòng)互聯(lián)產(chǎn)品、成都全網(wǎng)營銷推廣服務(wù)為核心業(yè)務(wù)。10余年網(wǎng)站制作的經(jīng)驗(yàn),使用新網(wǎng)站建設(shè)技術(shù),全新開發(fā)出的標(biāo)準(zhǔn)網(wǎng)站,不但價(jià)格便宜而且實(shí)用、靈活,特別適合中小公司網(wǎng)站制作。網(wǎng)站管理系統(tǒng)簡(jiǎn)單易用,維護(hù)方便,您可以完全操作網(wǎng)站資料,是中小公司快速網(wǎng)站建設(shè)的選擇。

最近在學(xué)習(xí)Ruby on rails,的確是一個(gè)優(yōu)秀的數(shù)據(jù)庫開發(fā)框架。但在過程中,發(fā)現(xiàn)在視圖文件夾中的rhtml文件里有大量的類似于以下的語句:

  1. < td>
  2. < %= link_to recipe.title,
     :action => “show”, :id => 1 %>
  3. < /td>   

這是一個(gè)指向鏈接,如果沒有冒號(hào)這句話的意思很好理解:這是一個(gè)指向http://127.0.0.1:3000/recipe/show/1的連接,也就是“顯示”數(shù)據(jù)庫表recipe中“id”為1的條目的信息,但讓人不解的是action和id前面的冒號(hào),它們是干甚么用的?Ruby面向?qū)ο筇匦缘囊粋€(gè)缺點(diǎn)

Ruby中,一切皆是對(duì)象。就一個(gè)簡(jiǎn)單的字符串舉例:

Ruby -e ‘puts “hello world”.class'
String

這里打印了”hello world”的字符串所屬的類,結(jié)果顯示它是一個(gè)String對(duì)象的實(shí)例。我們還可以顯示它的對(duì)象號(hào)。

Ruby -e ‘puts “hello world”.object_id'
41436168

Ruby一向標(biāo)榜自己是完全的面向?qū)ο蟮脑蚓驮谟诖?,它的確做的很徹底。但是凡事有好就有壞,一個(gè)對(duì)象占用的內(nèi)存空間顯然會(huì)比純粹的變量大得多,當(dāng)程序中涉及到大量的字符串時(shí),一個(gè)Ruby程序會(huì)占用過多的內(nèi)存。舉個(gè)例子說:
我們用hash列表來存儲(chǔ)歌曲的信息

 
 
 
  1. song1 = { ‘title' => ‘used to 
    love you', ‘a(chǎn)rtist' => ‘john legend'}   
  2. song2 = { ‘title' => ‘i still',
     ‘a(chǎn)rtist' => ‘backstreet boys'}   
  3. #……   
  4. #很多歌,這里只用兩首   
  5. for i in 1..2   
  6. thesong=”song”+i.to_s   
  7. eval < < -PROC   
  8. #{thesong}.each_key { |key| 
    puts key.object_id.to_s }   
  9. PROC   
  10. end  

結(jié)果:

41436144
41436408
41435904
41436000

因?yàn)閛bject_id各不相同,在hash表中的各個(gè)key都是獨(dú)立的String對(duì)象,即使內(nèi)容相同(如'title'),Ruby還是將其視為不同的對(duì)象,這樣就無端地占用了不少內(nèi)存。但事實(shí)上,大多數(shù)情況下,我們僅將hash中的key視為字段而已,不會(huì)涉及到String類的方法,Ruby自動(dòng)將其設(shè)置為對(duì)象有殺雞用牛刀之嫌。

Ruby symbol是什么

直譯來說就是“符號(hào)”,在Ruby就是形如:action這樣的,一個(gè)冒號(hào)后跟一段字符串。顯然,根據(jù)“一切都是對(duì)象”定律,它也是一個(gè)對(duì)象。

 
 
 
  1. Ruby -e ‘ puts :action.class ‘   
  2. Symbol  

這個(gè)對(duì)象存在的意義在于,它解決了“同內(nèi)容字符串,不同對(duì)象”帶來的過多占用內(nèi)存的問題。簡(jiǎn)單的說:action代表了'action'字符串,這里說的是字符串,不是字符串對(duì)象。

 
 
 
  1. Ruby -e ‘ puts :action ‘   
  2. action  

更確切的講就是一個(gè)Ruby symbol對(duì)象代表該對(duì)象的冒號(hào)后的字符串。

 
 
 
  1. Ruby -e ‘ puts :action ‘   
  2. action   
  3. Ruby -e ‘ puts :”hello world” ‘   
  4. hello world  

所有同內(nèi)容的字符串只需要一個(gè)標(biāo)記對(duì)象就可以代替,這樣減少了不必要的對(duì)象建立和內(nèi)存占用。但是,正如我強(qiáng)調(diào)的“symbol代表的是字符串,不是對(duì)象”,因此不要希望標(biāo)記可以使用String類的諸如capitalize,center等方法,如果使用的話只會(huì)得到提示方法未定義的錯(cuò)誤報(bào)告:

 
 
 
  1. Ruby -e ‘ puts :action.capitalize ‘   
  2. -e:1: undefined method ‘capitalize' for
     :action:Symbol' (NoMethodError)  
     

幸運(yùn)的是,Ruby symbol提供了轉(zhuǎn)換函數(shù)to_s用來生成一個(gè)字符串對(duì)象,它會(huì)提取字符串內(nèi)容并將其升級(jí)為對(duì)象。

Ruby -e ‘ puts :action.to_s.capitalize ‘
Action

另外,很重要的一點(diǎn)是,symbol沒有賦值方法,換句話說symbol一旦定義,將不能改變。

Ruby -e ‘ :action=”hello” ‘
syntax error

很遺憾,即使使用了to_s,賦值依然無法順利進(jìn)行,因?yàn)镽uby會(huì)認(rèn)為“to_s=”是一個(gè)未定義函數(shù)。除非明確地為被轉(zhuǎn)換生成的字符串對(duì)象指定一個(gè)引用(但事實(shí)上在復(fù)制之后該連接的指向又發(fā)生了變化):

 
 
 
  1. :action   
  2. myaction=:action.to_s   
  3. myaction=”lala”   
  4. puts myaction  

結(jié)果:

lala

怎么使用Ruby symbol

任何可以使用symbol的地方都可以使用與之向?qū)?yīng)的字符串對(duì)象。在rails中有建立類似javabean的方法:

attr_reader :action

它建立了一個(gè)讀取實(shí)例變量@action的方法,也可以寫成這樣:

attr_reader “action”

反之,只要字符串在程序運(yùn)行過程中不用改變。

字符串不必使用String類方法

那么我們可以放心用Ruby symbol來代替字符串對(duì)象,從而大大減少內(nèi)存的占用,在rails中尤為明顯。因?yàn)樾枰l繁地在各個(gè)控制方法和頁面之間跳轉(zhuǎn)和傳出數(shù)據(jù),大量的方法名由symbol來代替,及節(jié)約了內(nèi)存也提高了運(yùn)行速度。


網(wǎng)站題目:全面解讀Rubysymbol
新聞來源:http://www.5511xx.com/article/dhgdscs.html