Ruby:为什么它的工作方式如此?

时间:2013-10-10 10:55:07

标签: ruby

在此代码中:

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 ... end之后删除了@@a = @@a + 1并且@@a = 0,则输出为1和1.我知道初始化对象后,initialize方法在调用A.new后作为第一个方法执行,但我不确定如何处理类变量@@a

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

Ruby正在从上到下执行你的文件。

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

  1. 输入课程定义
  2. 定义类变量@@a,并将其指定为0
  3. 定义initialize函数和to_s函数
  4. 创建一个新的A,正在运行initialize并将@@a递增到1
  5. 创建一个新的A,正在运行initialize并将@@a递增到2
  6. @@a不在函数中的版本中:

    1. 输入课程定义
    2. 定义类变量@@a,并将其指定为0
    3. 将类变量@@a增加到1
    4. 定义to_s函数
    5. 创建新的A,不运行初始化程序
    6. 创建新的A,不运行初始化程序
    7. 所以@@a只增加一次 - 当Ruby执行类定义中的代码时。