1. 程式人生 > >[Ruby學習總結]Ruby中的變數

[Ruby學習總結]Ruby中的變數

Ruby中的變數有幾種形式,分別是區域性變數、例項變數、類變數、全域性變數,對於初學者來說,常常容易搞混,尤其像本人這種做java的,理解起來還是頭痛,經過仔細辨別學習,將這幾種變數的差異及使用場景總結如下:

一、命名方式

區域性變數   小寫字母或者“_”開頭,如user,直譯器解釋到時才開始在記憶體中存在,一個良好的習慣是在進行變數定義時用nil進行賦值初始化,否則會出現類似undefined local variable or method `z'的錯誤;

例項變數   @開頭,如@user,預設初始化為nil,此處的“例項”指的是類物件本身,或者類的物件;

類變數       @@開頭,如@@user,需要進行初始化後才能呼叫,否則會出現類似uninitialized class variable @@user in Account的錯誤;

全域性變數   $開頭,如$user,預設初始化為nil;

二、作用範圍

區域性變數   如user,只作用於本類、本方法或本模組內,不同於java語言習慣,在類中定義的變數,可以在類的方法中進行呼叫,Ruby中的區域性變數,類中定義的,只能在類中訪問,其子類、方法、內部類中都無法呼叫,如下邊示例程式碼

class Account
	user=User.new
	def myMethod
		puts user.name   #呼叫發生錯誤,user未定義
	end
end
例項變數   如@user,有點類似於java中POJO類的成員變數,類中隨意訪問,類外通過方法訪問,作用於本例項物件範圍內或本類的例項物件範圍內(這句話有點繞口,請注意分清楚類物件本身[Account,是Class類的一個物件]和 類例項化後的物件[Account.new,是Account類的一個物件]),這是兩個相互獨立的域,定義在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    #輸出:''
再看如下程式碼:
class A  
  #類的類例項變數在訪問前可以賦值也可以不賦值,不賦值就是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!'是定義在類物件本身的例項變數,@alpha='This is @alpha\' value from look!'是定義在類例項化後的物件中的例項變數,另外,使用例項變數時還應該注意一下幾點:

1、例項變數不管是在類中定義,還是在方法中定義,其都屬於類,而不是方法

2、例項變數只存在於例項範圍,不可在子類中引用或者賦值

3、例項變數永遠都是Private的,不能暴露為Public,外部訪問通過方法進行,可以使用attr_accessor簡便定義

類變數       如@@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,儘量少使用 ,作用於整個程式的生命週期,常駐記憶體,過量使用會引起效能下降,記憶體溢位,Ruby內建一些全域性變數,獲取相關資料十分方便,如$0’代表的是所執行應用程式的檔名稱,‘$:’代表的是預設的檔案搜尋路徑;'$$'代表的是 ruby 程式的程序 id