类变量

在这个程序中还有一些其他的有趣的东西。在顶级类 Thing 中你会看到:

  1. @@num_things = 0

此变量的名字是以两个 @ 字符开头的,@@num_things 定义这是一个“类变量”(class variable)。到目前为止,我们在类中使用的变量都是实例变量,以单个 @ 开头,例如 @name。而每个类的新对象(实例)会将自己的值分配给自己的实例变量,然而所有派生自特定类的对象共享相同的类变量。我已经给 @@num_things 赋值为 0 以确保其是有意义的。

在这里,@@num_things 类变量用来记录在游戏运行的 Thing 对象的数量。它只是在每个新对象被创建时在它的初始化方法中简单的递增类变量(通过 +=1):

  1. @@num_things +=1

如果你接着看我的代码,你会看到我创建一了包含 rooms 的数组(array)的 Map 类。这也包括一个标准的 to_s 方法,可以打印出数组中每个 room 的信息。不要担心 Map 类的实现,我们将在后面章节讨论数组及其方法。

滚动到代码文件的底部,然后运行程序看看我是如何创建和初始化所有的对象以及使用类变量,@@num_things,来记录已创建的 Thing 对象的数量。

类变量与实例变量
类变量 - 图1
对于 Thing 类,如有三个不同的 Thing 对象(实例),@name 作为实例变量,因各个对象(实例)的不同而取值不同;并且各个对象之间修改 @name 的值并不会相互影响,是独立的。Thing 类中有一个 @@num_things 类变量,它被三个对象共享,其中一个修改 @@num_things 的值时,其它对象访问到 @@num_things 的值也会发生改变。所以说,实例变量 @name 是对象独有的,而类变量 @@num_things 是被所有对象共享的。