我去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类变量。这怎么可能?如果您可以在构造函数中定义类变量,那么定义类变量有什么意义呢?
答案 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;