Ruby類(lèi)實(shí)例變量、類(lèi)實(shí)例方法和類(lèi)變量、類(lèi)方法的區(qū)別
在Ruby中類(lèi)實(shí)例變量、類(lèi)實(shí)例方法和類(lèi)變量、類(lèi)方法的區(qū)別比較微妙,而且用法也有相當(dāng)?shù)膮^(qū)別。本文探討一下他們的定義和基本的使用場(chǎng)景,以?huà)伌u引玉...
一.類(lèi)實(shí)例變量和類(lèi)變量
類(lèi)變量大家都很熟悉了,就是在類(lèi)定義中用@@開(kāi)頭的變量。類(lèi)變量是用于存儲(chǔ)類(lèi)的全局信息,它只屬于類(lèi),不同與類(lèi)實(shí)例變量(即用@開(kāi)頭定義的變量)每一個(gè)類(lèi)的對(duì)象都有一份數(shù)據(jù)。 類(lèi)變量是可以被繼承的,也就是說(shuō)如果我們派生一個(gè)子類(lèi),那么在子類(lèi)中是可以訪(fǎng)問(wèn)父類(lèi)的類(lèi)變量的。子類(lèi)和父類(lèi)共享一份數(shù)據(jù),對(duì)一個(gè)類(lèi)的修改會(huì)反映到另一個(gè)類(lèi)中。如下邊的代碼運(yùn)行結(jié)果顯示:
class A
#類(lèi)變量在訪(fǎng)問(wèn)前必須賦值,否則會(huì)有"uninitialized class variable“ 錯(cuò)誤
@@alpha=123 # Initialize @@alpha
@@beta=456 #Initialize @@beta
@@gamma=789 #Initialize @@gamma
def A.alpha
@@alpha
end
def A.alpha=(x)
@@alpha=x
end
def A.beta
@@beta
end
def A.beta=(x)
@@beta=x
end
def A.gamma
@@gamma
end
def A.gamma=(x)
@@gamma=x
end
def A.look
puts "#@@alpha, #@@beta, #@@gamma"
end
end
class B<A
end
#初始的數(shù)據(jù)
A.look
B.look
#修改父類(lèi)中的類(lèi)變量
A.alpha=111
A.look
B.look
運(yùn)行結(jié)果:
123, 456, 789
123, 456, 789
111, 456, 789
111, 456, 789
那么什么是類(lèi)的類(lèi)實(shí)例變量呢?類(lèi)的類(lèi)實(shí)例變量是在類(lèi)的類(lèi)方法中或方法外邊(不能在實(shí)例方法中,那是類(lèi)的實(shí)例變量)以@開(kāi)頭定義的變量,這樣定義的變量值屬于類(lèi)對(duì)象本身,不能夠被子類(lèi)繼承。類(lèi)對(duì)象這個(gè)說(shuō)法可能有些讓人疑惑,其實(shí)Ruby中的一起都是對(duì)象,我們定義的類(lèi)和Ruby的內(nèi)置類(lèi)本身就是元類(lèi)的對(duì)象。因此如果要定義需要和子類(lèi)共享的類(lèi)全局?jǐn)?shù)據(jù),使用類(lèi)變量;但是如果要定義僅供類(lèi)本身使用的類(lèi)全局?jǐn)?shù)據(jù)可以使用類(lèi)實(shí)例變量。還有一點(diǎn)需要注意的是,和類(lèi)變量不同的是類(lèi)實(shí)例變量不要求訪(fǎng)問(wèn)前必須賦值,不賦值它的值就是nil 。我們還是看一個(gè)例子,能夠更清楚一點(diǎn)...
class A
#類(lèi)的類(lèi)實(shí)例變量在訪(fǎng)問(wèn)前可以賦值也可以不賦值,不賦值就是nil
@alpha=123 # Initialize @alpha
@beta=456 #Initialize @beta
@gamma=789 #Initialize @gamma
def A.alpha
@alpha
end
def A.alpha=(x)
@alpha=x
end
def A.beta
@beta
end
def A.beta=(x)
@beta=x
end
def A.gamma
@gamma
end
def A.gamma=(x)
@gamma=x
end
def A.look
puts "#@alpha, #@beta, #@gamma"
end
end
class B<A
end
A.look
B.look
代碼的運(yùn)行結(jié)果如下:
123, 456, 789
, ,
nil
相關(guān)文章
使用Lua編寫(xiě)Nginx服務(wù)器的認(rèn)證模塊的方法
這篇文章主要介紹了使用Lua編寫(xiě)Nginx服務(wù)器的認(rèn)證模塊的方法,即諸如當(dāng)今流行的社交應(yīng)用接入等功能,需要的朋友可以參考下2015-06-06Lua的協(xié)程(coroutine)簡(jiǎn)介
這篇文章主要介紹了Lua的協(xié)程(coroutine)簡(jiǎn)介,本文講解了coroutine的創(chuàng)建、協(xié)程的三種狀態(tài)和yield函數(shù)的配合使用等內(nèi)容,需要的朋友可以參考下2015-04-04舉例簡(jiǎn)介L(zhǎng)ua中函數(shù)的基本用法
這篇文章主要介紹了舉例簡(jiǎn)介L(zhǎng)ua中函數(shù)的基本用法,--兩個(gè)橫線(xiàn)開(kāi)始單行的注釋,--[[加上兩個(gè)[和]表示多行的注釋--]],需要的朋友可以參考下2015-07-07openresty中使用lua-nginx創(chuàng)建socket實(shí)例
這篇文章主要介紹了openresty中使用lua-nginx創(chuàng)建socket實(shí)例,本文直接給出代碼實(shí)例和運(yùn)行效果,需要的朋友可以參考下2015-04-04Lua中使用.和:調(diào)用函數(shù)的區(qū)別
這篇文章主要介紹了Lua中使用.和:調(diào)用函數(shù)的區(qū)別,本文總結(jié)了它的調(diào)用函數(shù)的時(shí)傳入?yún)?shù)的區(qū)別,并給出了一個(gè)代碼實(shí)例,需要的朋友可以參考下2015-04-04Lua腳本語(yǔ)言基本語(yǔ)法快速入門(mén)教程
這篇文章主要介紹了Lua腳本語(yǔ)言基本語(yǔ)法快速入門(mén)教程,本文是一個(gè)簡(jiǎn)易教程,快速的羅列了常用語(yǔ)法,有一定編程語(yǔ)言基礎(chǔ)的同學(xué)更容易看芯片,需要的朋友可以參考下2015-07-07Lua面向?qū)ο缶幊讨A(chǔ)結(jié)構(gòu)table簡(jiǎn)例
今天小編就為大家分享一篇關(guān)于Lua面向?qū)ο缶幊讨A(chǔ)結(jié)構(gòu)table簡(jiǎn)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10