Ruby學習: 類的定義和執行個體變數

來源:互聯網
上載者:User

標籤:

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學習: 類的定義和執行個體變數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.