2

我有一个类似以下的模块

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?

4

2 回答 2

1

改用mattr_accessor _

于 2010-11-02T09:44:02.513 回答
0

我能够使用 self 语法从模块访问类变量

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]

如果有人能更清楚为什么这在红宝石中如此有效,请告诉我!

于 2012-11-11T19:30:17.987 回答