Ruby提供了四種變量,分別是局部變量仆邓、實例變量鲜滩、類變量、全局變量节值。
一徙硅、命名方式
局部變量:小寫字母或者“_”開頭,如user或者_(dá)user搞疗,解釋器解釋到時才開始在內(nèi)存中存在嗓蘑,在進(jìn)行變量定義時用nil進(jìn)行賦值初始化;
實例變量:以@開頭匿乃,如@user嗓奢,默認(rèn)初始化為nil蚀狰,此處的“實例”指的是類對象本身借卧,或者類的對象壁却;
類變量:以@@開頭,如@@user阳懂,需要進(jìn)行初始化后才能調(diào)用梅尤;
全局變量:以$開頭,如$user岩调,默認(rèn)初始化為nil巷燥;
二、作用范圍
局部變量:如user号枕,只作用于本類缰揪、本方法或本模塊內(nèi)。Ruby中的局部變量葱淳,類中定義的钝腺,只能在類中訪問,其子類赞厕、方法艳狐、內(nèi)部類中都無法調(diào)用,如下邊示例代碼
class Account
user=User.new
def myMethod
puts user.name #調(diào)用發(fā)生錯誤皿桑,user未定義 user的作用域不在此
end
end
實例變量:如@user毫目,作用于本實例對象范圍內(nèi)或本類的實例對象范圍內(nèi)蔬啡,在類定義內(nèi)對實例變量的賦值和讀取沒有限制;在類外訪問實例變量時镀虐,則可以通過方法來訪問箱蟆。
比如user,是User類的一個對象刮便,user.new是User類的一個實例對象空猜,這是兩個相互獨(dú)立的域,定義在Account中的變量不能在Account.new中訪問恨旱,反之亦然辈毯,如下邊示例代碼
class A
#類的類實例變量在訪問前可以賦值也可以不賦值,不賦值就是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 #輸出:''
類變量:如@@user窖杀,作用于類的所有范圍,所有實例對象共享裙士,包括子類及其實例對象入客,類變量通過Protected聲明的,如下邊示例代碼
class A
#類的類實例變量在訪問前可以賦值也可以不賦值腿椎,不賦值就是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 B<A
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桌硫,盡量少使用 ,作用于整個程序的生命周期啃炸,常駐內(nèi)存铆隘,過量使用會引起性能下降,內(nèi)存溢出南用,Ruby內(nèi)置一些全局變量膀钠,獲取相關(guān)數(shù)據(jù)十分方便,如$0’代表的是所運(yùn)行應(yīng)用程序的文件名稱裹虫,‘$:’代表的是默認(rèn)的文件搜索路徑;'$$'代表的是 ruby 程序的進(jìn)程 id