类变量和扩展模块

发布于 2024-09-29 20:29:55 字数 777 浏览 3 评论 0原文

我有一个如下所示的模块

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?

I have a module like the following

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

so that

 B.bar outputs '1'.

However, I would like to have .bar only be defined if .foo is called. I tried

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

The problem is that

B.bar

returns the error "uninitialized class variable @@var in MyModule::SingletonMethods". How can I make it so that a variable defined in .foo is available to .bar?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

与君绝 2024-10-06 20:29:55

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

如果有人可以进一步解释为什么这在 ruby​​ 中如此有效,请告诉我!

I was able to access class variables from a module using the self syntax

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

Now calling User.headers gives me the expected result of
[:slug, :email, :crypted_password]

If anyone can shed more light on why this works exactly so in ruby, please let me know!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文