Ruby中的變量有幾種形式,分別是局部變量、實(shí)例變量、類變量、全局變量,對(duì)于初學(xué)者來(lái)說(shuō),常常容易搞混,尤其像本人這種做java的,理解起來(lái)還是頭痛,經(jīng)過(guò)仔細(xì)辨別學(xué)習(xí),將這幾種變量的差異及使用場(chǎng)景總結(jié)如下:
一、命名方式
1.局部變量:小寫字母或者“_”開頭,如user,解釋器解釋到時(shí)才開始在內(nèi)存中存在,一個(gè)良好的習(xí)慣是在進(jìn)行變量定義時(shí)用nil進(jìn)行賦值初始化,否則會(huì)出現(xiàn)類似undefined local variable or method `z'的錯(cuò)誤;
2.實(shí)例變量:@開頭,如@user,默認(rèn)初始化為nil,此處的“實(shí)例”指的是類對(duì)象本身,或者類的對(duì)象;
3.類變量:@@開頭,如@@user,需要進(jìn)行初始化后才能調(diào)用,否則會(huì)出現(xiàn)類似uninitialized class variable @@user in Account的錯(cuò)誤;
4.全局變量:$開頭,如$user,默認(rèn)初始化為nil;
二、作用范圍
局部變量:如user,只作用于本類、本方法或本模塊內(nèi),不同于java語(yǔ)言習(xí)慣,在類中定義的變量,可以在類的方法中進(jìn)行調(diào)用,Ruby中的局部變量,類中定義的,只能在類中訪問(wèn),其子類、方法、內(nèi)部類中都無(wú)法調(diào)用,如下邊示例代碼:
復(fù)制代碼 代碼如下:
class Account
user=User.new
def myMethod
puts user.name #調(diào)用發(fā)生錯(cuò)誤,user未定義
end
end
實(shí)例變量:如@user,有點(diǎn)類似于java中POJO類的成員變量,類中隨意訪問(wèn),類外通過(guò)方法訪問(wèn),作用于本實(shí)例對(duì)象范圍內(nèi)或本類的實(shí)例對(duì)象范圍內(nèi)(這句話有點(diǎn)繞口,請(qǐng)注意分清楚類對(duì)象本身[Account,是Class類的一個(gè)對(duì)象]和 類實(shí)例化后的對(duì)象[Account.new,是Account類的一個(gè)對(duì)象]),這是兩個(gè)相互獨(dú)立的域,定義在Account中的變量不能在Account.new中訪問(wèn),反之亦然,如下邊示例代碼:
復(fù)制代碼 代碼如下:
class A
#類的類實(shí)例變量在訪問(wèn)前可以賦值也可以不賦值,不賦值就是nil
@alpha='This is @alpha\' value!'
def A.look
puts "#@alpha"
end
def look
puts "#@alpha"
end
end
A.look #輸出:'This is @alpha' value!''
A.new.look #輸出:''
再看如下代碼:
復(fù)制代碼 代碼如下:
class A
#類的類實(shí)例變量在訪問(wèn)前可以賦值也可以不賦值,不賦值就是nil
@alpha='This is @alpha' value!'
def A.look
puts "#@alpha"
end
def look
@alpha='This is @alpha\' value from look!'
puts "#@alpha"
end
def look_again
puts "#@alpha"
end
end
A.look #輸出:'This is @alpha' value!''
a=A.new
a.look #輸出:'This is @alpha' value from look!'
a.look_again #輸出:'This is @alpha' value from look!'
可見,@alpha='This is @alpha' value!'是定義在類對(duì)象本身的實(shí)例變量,@alpha='This is @alpha\' value from look!'是定義在類實(shí)例化后的對(duì)象中的實(shí)例變量,另外,使用實(shí)例變量時(shí)還應(yīng)該注意一下幾點(diǎn):
1、實(shí)例變量不管是在類中定義,還是在方法中定義,其都屬于類,而不是方法
2、實(shí)例變量只存在于實(shí)例范圍,不可在子類中引用或者賦值
3、實(shí)例變量永遠(yuǎn)都是Private的,不能暴露為Public,外部訪問(wèn)通過(guò)方法進(jìn)行,可以使用attr_accessor簡(jiǎn)便定義
類變量:如@@user,作用于類的所有范圍,所有實(shí)例對(duì)象共享,包括子類及其實(shí)例對(duì)象,類變量通過(guò)Protected聲明的,如下邊示例代碼:
復(fù)制代碼 代碼如下:
class A
#類的類實(shí)例變量在訪問(wèn)前可以賦值也可以不賦值,不賦值就是nil
@@alpha='This is @alpha' value!'
def A.look
puts "#@@alpha"
end
def look
puts "#@@alpha"
end
def look_again
puts "#@@alpha"
end
end
class BA
end
A.look #輸出:'This is @alpha' value!'
B.look #輸出:'This is @alpha' value!'
a=A.new
a.look #輸出:'This is @alpha' value!'
a.look_again #輸出:'This is @alpha' value!'
b=B.new
b.look #輸出:'This is @alpha' value!'
b.look_again #輸出:'This is @alpha' value!'
全局變量:如$user,盡量少使用 ,作用于整個(gè)程序的生命周期,常駐內(nèi)存,過(guò)量使用會(huì)引起性能下降,內(nèi)存溢出,Ruby內(nèi)置一些全局變量,獲取相關(guān)數(shù)據(jù)十分方便,如$0'代表的是所運(yùn)行應(yīng)用程序的文件名稱,‘$:'代表的是默認(rèn)的文件搜索路徑;'$$'代表的是 ruby 程序的進(jìn)程 id。
您可能感興趣的文章:- Ruby的基本語(yǔ)法學(xué)習(xí)總結(jié)
- Ruby中的方法(函數(shù))學(xué)習(xí)總結(jié)
- 詳解Ruby中的異常