標籤:
ruby是完全物件導向的,所有的資料都是對象,沒有獨立在類外的方法,所有的方法都在類中定義的。
一、類的定義文法
類的定義以 class 關鍵字開頭,後面跟類名,以 end標識符結尾。
類中的方法以 def關鍵字開頭,後面跟方法名及參數列表(如果有的話),以 end標識符結尾。
類也有建構函式,名字必須為initialize。
對象通過new來建立,new是類的方法。
舉例如下:
class Demo def initialize puts "begin create object" end def test puts "test" endend #建立對象,調用對象的方法demo1= Demo.newdemo1.test
上面的代碼先定義了一個類Demo ,類中定義了兩個分方法,這兩個方法均沒參數。
接著通過new來建立了一個對象,賦值給變數 demo1,最後調用 類的 test方法。
上面代碼啟動並執行輸出資訊是:
begin create object
test
二、類中的成員變數
類中有三種變數
1、一個是局部變數,在方法內 和方法的參數。這個就是普通的標識符定義即可。
2、類的執行個體變數。這個定義與其它語言有差別,需要以 @符號來標識。不能直接通過對象訪問,需要通過方法來訪問,相當於java中的private成員。
3、類變數,屬於類層級的,為類的所有對象所共用,需要以 @@符號來標識
三、類的執行個體變數
下面我們來看一個類的執行個體變數的例子:
class Demo def initialize(value) @a = value end def getA return @a end def setA(value) @a=value endend #建立對象,調用對象的方法demo1= Demo.new(2)puts demo1.getAdemo1.setA(10)puts demo1.getA
上面代碼建立的Demo類在建構函式中定義和初始化了一個執行個體變數 @a,並且定義了get和set方法來訪問執行個體變數。
在ruby中,無法直接在類的外部存取執行個體變數,如 puts [email protected] 這樣會報語法錯誤的。
對於執行個體變數,如果每次需要定義相應的 get 和 set方法,並且給通過get和set方法才能在外部存取,這顯得比較囉嗦和麻煩。
ruby通過其元編程的特性可以簡化這些操作。具體我們來看下範例程式碼:
class Demo attr_accessor:a def initialize(value) @a=value endend #建立對象,調用對象的方法demo1= Demo.new(2)puts demo1.ademo1.a = 10puts demo1.a
上面代碼通過 attr_accessor :a 就定義了一個執行個體變數 @a ,並在建構函式中對它初始化。
與上面 的區別是,外部可以直接通過物件變數訪問,但不能加 @符號,不過在類的方法內訪問需要加@符號。
可以看出,採用這種方式,省去了定義get和set方法,訪問起來更加簡潔。
設定attr_accessor,會自動對執行個體變數(如上面例子中的 @a),建立set和get方法。
對應的還有attr_reader只設定get方法,attr_writer只設定set方法。
class Demo attr_reader:a def initialize(value) @a=value end def set(value) @a = value puts @a endend #建立對象,調用對象的方法demo1= Demo.new(2)demo1.set(10)puts demo1.a
如果定義成attr_reader,則在類的外部只能demo1.a來讀取變數資訊,但不能 demo1.a = 2 這種方式來賦值(因為這實際調用的是set方法,而attr_reader不會產生set方法)。注意,這隻影響外部存取,類的內部方法使用沒有關係。
class Demo attr_writer:a def initialize(value) @a=value end def set(value) @a = value puts @a end def print puts @a endend #建立對象,調用對象的方法demo1= Demo.new(2)demo1.a =20demo1.print
從上面例子可以看出,定義成 attr_writer方式,在類的外部只能賦值,不能讀取(如這裡的 puts demo1.a會報語法錯誤。).
同樣類的內部訪問不受影響。
需要說明的是,類的執行個體變數不一定先要在建構函式中定義和初始化。 可以在類的任意方法中定義和使用,使用前也不需要初始化。
如下面代碼:
class Demo def set(value) @a = value end def print puts @a endend #建立對象,調用對象的方法demo1= Demo.newdemo1.printdemo1.set(10)demo1.print
如果在初始化之前就引用執行個體變數,則值為 nil (類似java中的null)。如上面代碼,建立對象後直接調用 print方法,在print方法中就引用了@a,而在這之前@a並未被定義和初始化,這不會報錯,只是這時@a的值為 nil.
可以看出,相對java, c++等傳統語言來說,ruby中類的執行個體變數的操作更加靈活和清晰。
Ruby學習: 類的定義和執行個體變數