类变量和扩展模块

时间:2010-11-02 03:35:04

标签: ruby class-variables

我有一个类似以下的模块

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中返回错误“未初始化的类变量@@ var”。我怎样才能使.foo中定义的变量可用于.bar?

2 个答案:

答案 0 :(得分:1)

使用mattr_accessor代替

答案 1 :(得分: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]

如果有人能够更清楚地了解为什么在红宝石中这样做的话,请告诉我!