2014-09-28 86 views
1

类变量是这样的:类实例变量的正确用法

class Hello 
    @@x = 0 

    def self.counter 
    @@x 
    end 

    def initialize 
    @@x += 1 
    end 
end 

Hello.new 
Hello.new 
Hello.new 
p Hello.counter 
#=> 3 

但类实例变量不:

class Goodbye 
    @x = 0 

    def self.counter 
    @x 
    end 

    def initialize 
    @x += 1 
    end 
end 

Goodbye.new 
Goodbye.new 
Goodbye.new 
Goodbye.new 
p Goodbye.counter 
#=> Error 

我在做什么错?我的印象是,类实例变量与类变量相同,只是没有继承问题......但是你如何使用它们(例如,像在我这里发布的代码中那样计算特定类的实例)?

+0

的可能重复(http://stackoverflow.com/questions/3802540/difference-between-class-variables-和类实例变量) – 2014-09-28 09:51:57

+0

没有解释为什么使用@@ x的代码工作,并且与@x使用相同的代码没有(这就是为什么我问这个问题) – OldBoy 2014-09-28 09:56:52

+0

关于'为什么这个代码不工作的问题“关于SO的话题。 – 2014-09-28 09:58:29

回答

1

实例变量属于对象(实例),这就是为什么他们被称为那个。在第2行和第5行中,@x属于对象Goodbye,但在第9行中,@x属于Goodbye的实例。你永远不会初始化这个实例变量,并且未初始化的实例变量计算为nil,nil没有+方法,如果你得到一个NoMethodError

请注意,Goodbye.counter确实不是提出一个像你声称的错误,它只是返回0。该错误在initialize内部引发。

这里是小小的更正:[?类变量和类的实例变量之间的不同]

class Goodbye 
    @x = 0 

    def self.counter 
    @x 
    end 

    def self.new 
    @x += 1 
    super 
    end 
end 

Goodbye.new 
Goodbye.new 
Goodbye.new 
Goodbye.new 
p Goodbye.counter 
#=> 4 
+0

此外,它对原始错误示例进行了简单更改,需要在类的beginnig处添加:“class << self attr_accessor:x; end”,并将“def initialize Goodbye.x + = 1; end ”。谢谢你的解释! – OldBoy 2014-09-28 11:35:30