【问题标题】:Class variables and extending a module类变量和扩展模块
【发布时间】:2011-05-03 18:00:53
【问题描述】:

我有一个类似下面的模块

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?

【问题讨论】:

    标签: ruby class-variables


    【解决方案1】:

    【讨论】:

    【解决方案2】:

    我能够使用 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]

    如果有人能更清楚地说明为什么这在 ruby​​ 中如此有效,请告诉我!

    【讨论】:

      猜你喜欢
      • 2013-04-12
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 2018-12-10
      • 2011-04-14
      • 2020-04-25
      • 2015-05-14
      相关资源
      最近更新 更多