0

我去了这个页面来了解 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方法(构造函数)中创建变量并在另一个方法中使用它,就好像它是类变量一样。这怎么可能?如果您可以在构造函数中定义类变量,那么定义类变量有什么意义?

4

2 回答 2

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​​ 中用作前缀时,表示该变量是实例变量。

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

如果您不知道,这里有一篇关于这些之间区别的好文章。

于 2013-04-24T19:50:36.080 回答
3

我认为您混淆了类 (@@) 和实例 (@) 变量。在 Ruby 中,类变量更像是 C++ 中的静态类变量,而实例变量就像 C++ 中的常规类变量:

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;
于 2013-04-24T19:49:36.603 回答