0

在这段代码中:

class A
  @@a = 0
  def initialize
      @@a = @@a + 1
  end

  def to_s
    @@a
  end
end

a = A.new
p a
b = A.new
p b

输出是 1 和 2。但是如果我在第三行之后立即删除def initialize ... endand ,那么输出是 1 和 1。我知道在初始化对象后,该方法作为调用后的第一个方法执行,但是我'我不太确定如何处理类变量。@@a = @@a + 1@@a = 0initializeA.new@@a

@@a当我@@a = @@a + 1没有包裹在方法中时,为什么变量不自动递增initialize?我的意思是,增加它是有意义的,因为在你调用A.new,@@a = 0@@a = @@a + 1=> 1 = 0 + 1b = A.new之后,你重复并得到 2。由于某种原因这不会发生,我不知道为什么.

4

2 回答 2

3

这是因为类主体中的代码执行一次 - 当类加载时。所以@@a类变量只增加一次。

另一方面,initialize每次调用时方法中的代码都会运行A.new

于 2013-10-10T11:00:24.470 回答
3

Ruby 从上到下执行您的文件。

在具有该initialize功能的版本中,Ruby(粗略地说):

  1. 输入类定义
  2. 定义类变量@@a,并将其赋值为 0
  3. 定义initialize函数和to_s函数
  4. 创建一个新的A,正在运行initialize并递增@@a到 1
  5. 创建一个新的A,正在运行initialize并递增@@a到 2

@@a没有函数的版本中:

  1. 输入类定义
  2. 定义类变量@@a,并将其赋值为 0
  3. 将类变量@@a增加到 1
  4. 定义to_s函数
  5. 创建一个新的A,不运行初始化程序
  6. 创建一个新的A,不运行初始化程序

So@@a只增加一次——当 Ruby 执行类定义中的代码时。

于 2013-10-10T11:02:45.373 回答