完全理解Ruby类变量

时间:2012-09-14 12:18:40

标签: ruby

在此代码块中,

@@y = 1
class MyClass
 @@y = 2
end
p @@y # => 2
天真地看来,@@y似乎位于顶级范围内,并且它与@@y范围内的MyClass不同。{1}}。为什么@@y受到MyClass类定义的影响? (为什么结果为2?)

3 个答案:

答案 0 :(得分:7)

我们来看看这个例子。 @@x中的Bar确实与@@x中的Foo分开。

class Foo
  @@x = 1
end

class Bar
  @@x = 2
end

Foo.class_variable_get(:@@x) # => 1
Bar.class_variable_get(:@@x) # => 2

但如果BarFoo的孩子,会发生什么?

class Foo
  @@x = 1
end

class Bar < Foo
  @@x = 2
end

Foo.class_variable_get(:@@x) # => 2
Bar.class_variable_get(:@@x) # => 2

在这种情况下,@@x在两种情况下都是相同的,它是Foo中声明的那个。

现在,回到你的例子:

@@y = 1
class MyClass
  @@y = 2
end
p @@y

第一行在根范围中声明了类变量。 Root是一个特殊对象main,其类型为Object。所以,基本上,你是在Object类上定义一个类变量。由于所有内容都是Object,因此MyClass的定义也会继承@@y并且能够更改它。

答案 1 :(得分:1)

当你这样做时

@@y = 1

您在Object上定义它。由于MyClass是Object的子类,因此它可以访问它的类变量。

@@y = 1
class MyClass
  @@y = 2
end
p @@y
puts MyClass.superclass #=> Object
puts Object.class_variables #=> @@y

答案 2 :(得分:-1)

全球变量是这样的:

$y = 1

和班级变量是这样的:

@@y = 1

所以实际上你使用了类vars

这是一个链接:vars