2011-08-26 61 views
1

我不想從外部設置一個類的類變量(通過attr_accessor),然後從它的一個對象中訪問它。我使用紅寶石1.9.2。這是我的代碼:有什麼不能從Ruby中的對象訪問類變量?

class Service 
    def initialize(id) 
    @my_id = id 
    end 

    class << self 
    attr_accessor :shared_id 
    end 

    def system_id 
    @my_id + @@shared_id 
    end 
end 

如果我設置Service.shared_id = "A2",然後調用Service.new("A").system_id,這不返回「AA2」。它顯示了以下錯誤:

未初始化的類變量@@在服務

shared_id行爲就像如果我沒有設置Service.service_id。有人能解釋爲什麼發生這種情況嗎?

回答

5

attr_accessor創建方法來操縱實例變量 - 它不創建實例或類變量。要創建一個類變量,你必須將其設置爲東西:

@@shared_id = something 

有沒有輔助方法來生成類變量訪問,所以你必須自己編寫。

但是,由於其奇怪的查找規則,類變量很少使用 - 甚至可以避免使用。而是使用類級別的實例變量。

class Service 
    @shared_id = thing 

    class << self 
    attr_accessor :shared_id 
    end 

    def system_id 
    # use self.class.shared_id; you could add a shared_id helper to generate it, too. 
    end 
end 
+0

簡而言之,類實例級別的attr_accessor不使用全局變量。它在該類中使用一個實例變量。 – e3matheus

0

記住@@class_var是對所有課程。

+0

您的意思是所有子類的全局嗎?如果沒有,我不明白這一點:S – e3matheus

4

cattr_accessor怎麼樣?

+0

這可行,但我想明白爲什麼我的代碼沒有。但是,我發現您發佈的鏈接非常有用,因爲有幾條評論確實解釋了class_inheritable_accessor實際上並不使用全局變量。 – e3matheus