Ruby定义类变量

时间:2013-04-24 19:34:43

标签: ruby oop class

我去this page学习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方法(构造函数)中创建变量,并在另一个方法中使用它,就好像它是&#39 ; sa类变量。这怎么可能?如果您可以在构造函数中定义类变量,那么定义类变量有什么意义呢?

2 个答案:

答案 0 :(得分: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被初始化为零。然后每次我们创建一个新对象时,我们都会增加它。

当然,在这个例子中可能使用类变量的原因是:

  • 将客户数量与客户封装起来是有意义的,而不是使用某些全球性的

  • 因为它是附属于客户类的,所以外界无法对其进行修改,使其意味着与其应有的意思不同,或者做出意想不到的事情。

这就是说,它有点像“不与陌生人玩耍”的规则。

@@@

@用作ruby中的前缀时,它指定变量是实例变量。

使用@@时,这意味着它是一个类变量。

如果您不知道,这是关于difference between these的好文章。

答案 1 :(得分: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;