2013-04-24 99 views
0

我去了this page瞭解Ruby類。該網頁上的代碼是這樣的:Ruby定義類變量

class Customer 
    @@no_of_customers=0 
    def initialize(id, name, addr) 
     @cust_id=id 
     @cust_name=name 
     @cust_addr=addr 
    end 
    def display_details() 
     puts "Customer id #@cust_id" 
     puts "Customer name #@cust_name" 
     puts "Customer address #@cust_addr" 
    end 
    def total_no_of_customers() 
     @@no_of_customers += 1 
     puts "Total number of customers: #@@no_of_customers" 
    end 
end 

我明白@@意味着類變量,但我不知道如何創建在initialize方法(構造函數)一個變量,並使用它裏面的另一種方法,如果是一個類變量。這怎麼可能?如果你可以在構造函數中定義它,那麼定義類變量有什麼意義呢?

+1

它在構造函數中如何定義類變量? – yngccc 2013-04-24 19:38:51

+0

@yngum'@ cust_id = id'。我想這不是定義類變量,但我的問題更多的是如何在一個函數中定義一個變量並在該函數之外使用它。 – Richard 2013-04-24 19:41:49

+1

'@ cust_id'是一個實例變量,您顯然可以在任何實例方法中使用實例變量。 – yngccc 2013-04-24 19:45:20

回答

4

如果我正確理解你的問題(如果我不是,請發表評論),你在問我們爲什麼通常不在構造函數中定義類變量。

在上面的代碼示例中,@@no_of_customers類變量沒有在構造函數中定義,因爲它意味着該類的所有成員都可以訪問它,並且它可以跟蹤客戶的數量。所以,如果我們的構造是這樣的:

def initialize(id, name, addr) 
    @@no_of_customers=0 
    @cust_id=id 
    @cust_name=name 
    @cust_addr=addr 
end 

我們將覆蓋該變量與每個人定義類的新實例時0。一個更合適的類的定義是這樣的:

class Customer 
    @@no_of_customers=0 
    def initialize(id, name, addr) 
    @@no_of_customers += 1 
    @cust_id=id 
    @cust_name=name 
    @cust_addr=addr 
    end 
    ... 
end 

因此,類變量@@no_of_customers在零之前,我們實例化的任何對象初始化。然後每次我們創建一個新對象時,我們都會增加它。

當然,有人可能會使用一個類變量這個例子的原因是:

  • 這是有道理的封裝客戶提供的客戶數量,而不是使用一些全球

  • 因爲它附屬於客戶類別,外部世界不能修改它,使其意味着不同於它應該表達的意思,或者做一些意想不到的事情。

這就是所謂的,它有點像「不與陌生人玩」規則。

@@@

@用作紅寶石前綴,它表示該變量是一個實例變量。

當使用@@時,這意味着它是一個類變量。

如果您不知道,這裏有一篇關於difference between these的好文章。

+0

我不明白的一件事是,在C++中,當您創建類對象時,該對象具有它自己的設置變量值。所以,如果你錯誤地寫了你寫的函數,不管你創建的客戶類有多少個對象,每個對象的'no_of_customer'值都是1.你提出的建議與我從C++知道的所有OOP概念是不一致的。可以多解釋一下? – Richard 2013-04-24 23:08:16

3

我認爲你是混淆類(@@)和實例(@)變量。在Ruby類變量更像在C++類的靜態變量和實例變量是像在C regual類變量++:

class Test 
    @@cvar = 1 
    def initialize 
     @ivar = 0 
    end 
end 

是或多或少相當於(對不起,我的C++是生鏽):

class Test { 
    public: 
     Test() : ivar(0) {} 
    private: 
     static int cvar; 
     int ivar; 
}; 
int Test::cvar = 1;