0

請解釋,我無法理解。類別變量

class Foo 
    @a = 123 
    @@b = 123 
end 

變量對象類和類變量的優點是什麼?我應該什麼時候第一次使用,哪一秒?

回答

4

實例級別變量區域爲類的每個實例重新創建。例如,對於Foo的每個實例,變量@id應該是唯一的。但是,對於每個類型的實例,可能有一些值應該是相同的。在這種情況下,類變量會更合適。

類別級變量的一個重要副作用是它們在派生類中共享以及。這意味着改變'Foo'子類的值也會改變'Foo'對象的值。這可能是你想要的,但找出困難的方式可能有點令人驚訝。

例如:

class Foo 
    @@some_var = 1 
    def bar 
    puts(@@some_var) 
    end 
end 

class Baz < Foo 
    def perhaps_unexpected 
    @@some_var = 10 
    Foo.new.bar #prints '10' 
    end 
end 
+0

此代碼打印3和零。爲什麼? 'code'class MyClass的 \t @@全球= 3 \t @local = 7 \t \t DEF my_print \t \t放@@全球 \t \t提出@local \t端 端 OBJ = MyClass.new obj.my_print'code' – user413881 2011-06-06 19:57:53

+0

因爲你不能在類作用域中初始化成員變量,所以你需要在一個方法內部(通常是構造函數'initialize')完成它。從文檔中:'一個實例變量的名字以@開始,其範圍限制在self指向的任何對象上.'在你的代碼中'self'不引用該類作用域,所以該變量未初始化。 – 2011-06-06 20:05:18

+0

謝謝你的解釋 – user413881 2011-06-06 20:13:55

1

當你想在類的所有實例共享變量使用類變量,當你想用一個實例變量,每個實例有它自己的非共享變量。