2010-11-02 72 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]

预期的结果。如果任何人都可以更多关于为什么这个工作原理在红宝石中更加清晰,请让我知道!