2016-03-09 163 views
1

我在Ruby中使用類繼承變量跟蹤到目前爲止創建的實例的數量。爲了讓我的代碼保持乾爽,我在一個基類中實現了大部分邏輯,這些基類都是我的其他類繼承的。如何在繼承類中自動聲明類實例變量

class Entity 
    @instance_counter = 0 

    class << self 
    attr_accessor :instance_counter 
    end 

    def initialize 
    self.class.instance_counter += 1 
    end 
end 

這個工程除了一兩件事完美的罰款:

我在每個子類中定義@instance_counter,否則我會得到一個NoMethodError

class Child < Entity 
    @instance_counter = 0 
end 

是否有辦法在每個孩子中自動聲明變量,以便我不必手動執行該操作?

回答

2

我不知道這是不是最好的辦法,但這裏是我怎麼可能做到這一點:

class Entity 
    singleton_class.send(:attr_writer, :instance_counter) 
    def self.instance_counter; @instance_counter ||= 0; end 
    def initialize 
    self.class.instance_counter += 1 
    end 
end 
+0

是'singleton_class.send'這裏真正需要的? – Mhmd

+1

這只是在問題示例中打開'singleton_class'的替代方法。我更喜歡它,例如在這種情況下,當我只在這種情況下進行一次呼叫時,但我認爲這是個人喜好的問題。 'send'是必需的,因爲'attr_writer'是一個私有方法。 –

+0

謝謝@kardeiz!這很有效,而且太簡單了。感覺像我的紅寶石變得有點生鏽。 – jdno