2012-07-22 124 views
2

作爲一個實驗,我寫了一些代碼,看起來像紅寶石初始化實例變量以外的方法

class MyClass 

    @var = 100 

    def hello 
     p "hello" 
    end 

end 

我知道,如果我這樣做MyClass.new@var沒有那個對象上定義的,而我認爲這將定義@var在類MyClass上。

這是否有實際用法?

回答

5

確實有一個用途:類變量。正常的Ruby類變量實現,@@超類及其子類之間的相同的變量:

class A 
    @@v = 0 
    def self.v; @@v; end 
    def self.v=(val); @@v=val; end 
end 
class B < A; end 
A.v #-> 0 
A.v= 3 #-> 3 
B.v #->3 
B.v= 42 #-> 42 
A.v #-> 42 

顯然,這是沒什麼用(除了事實是,與類的實例變量,類變量也可以通過實例方法直接訪問,而不是通過self.class)。但與類的實例變量相同的例子:

class A 
    @v = 0 
    def self.v; @v; end 
    def self.v=(val); @v=val; end 
end 
class B < A; end 
A.v #-> 0 
A.v= 3 #-> 3 
B.v= 42 #-> 42 
A.v #-> 3 

此外,類的實例變量可以利用所有已爲實例變量寫的元編程的,就像這樣:

class Foo 
    class << self 
    attr_accessor :v #Uses a class instance variable 
    end 
end 
+0

你的第二個例子是行不通的,怎麼你會在類接收器上調用實例方法嗎? – kamal 2015-10-28 16:49:50

+0

@kamal:哎呦。固定! – Linuxios 2015-10-28 19:55:21

1

如果您爲@var

MyClass.singleton_class.class_eval { attr_accessor :var } 

存取方法,那麼你可以把@var像類變量。區別在於它不會被MyClass的子類繼承。

_why利用這個在Dwemthy's Array