2014-09-28 88 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