2010-11-02 64 views
1

我有如下所示類變量和延伸的模塊

module MyModule 
    def self.included(base) 
    base.extend ClassMethods 
    end 

    module ClassMethods 
    def foo 
     @@var = 1 
    end 

    def bar 
     puts @@var 
    end 
    end 
end 

class A 
    include MyModule 
    foo 
end 

class B < A; end 

一個模塊使得

B.bar outputs '1'. 

然而,我想有如果包含.foo被稱爲僅的.bar來限定。我試圖

module MyModule 
    def self.included(base) 
    base.extend ClassMethods 
    end 

    module ClassMethods 
    def foo 
     @@var = 1 
     extend SingletonMethods 
    end 

    module SingletonMethods 
    def bar 
     puts @@var 
    end 
    end 
end 

的問題是,

B.bar 

返回錯誤 「在MyModule的:: SingletonMethods未初始化的類變量@@變種」。我怎樣才能使.foo中定義的變量可用於.bar?

回答

2

使用mattr_accessor代替

+0

是否只有mattr_accessor Rails? – 2011-09-27 23:27:36

+1

是的,但實現非常簡單 - https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb – Sigurd 2011-09-28 10:53:51

+0

這節省了我很多時間。 – 2016-02-10 18:27:42

0

我能夠用自己的語法

class User 
    include Base 
    @@attributes = [:slug, :email, :crypted_password] 
end 

module Base 
    def self.included(base) 
    base.extend ClassMethods 
end 

def headers 
    if defined? self.attributes 
    self.attributes 
    end 
end 
end 

現在呼籲User.headers從模塊訪問類變量給我的 [:slug, :email, :crypted_password]

預期的結果。如果任何人都可以更多關於爲什麼這個工作原理在紅寶石中更加清晰,請讓我知道!