在此代码中:
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.这不会因某种原因而发生,我不知道为什么。
答案 0 :(得分:3)
这是因为类的主体中的代码被执行一次 - 当加载类时。所以@@a
类变量只增加一次。
另一方面,initialize
方法中的代码每次调用A.new
时都会运行。
答案 1 :(得分:3)
Ruby正在从上到下执行你的文件。
在具有initialize
功能的版本中,Ruby(粗略地说):
@@a
,并将其指定为0 initialize
函数和to_s
函数A
,正在运行initialize
并将@@a
递增到1 A
,正在运行initialize
并将@@a
递增到2 在@@a
不在函数中的版本中:
@@a
,并将其指定为0 @@a
增加到1 to_s
函数A
,不运行初始化程序A
,不运行初始化程序所以@@a
只增加一次 - 当Ruby执行类定义中的代码时。