【问题标题】:Module and class variable scope in rubyruby 中的模块和类变量范围
【发布时间】:2014-02-27 08:39:08
【问题描述】:

我仍在努力清楚地理解模块/类/实例变量...

我的代码目前看起来像这样......

module Foo
  @@var1 ={}
  @@var2 =[]
  @@var3 = nil

  def m1(value)
    @@var2 << value
  end

  def m2(value)
    @@var1[@@var3]=value
  end
end

class Bar
  include Foo
  p @@var1
end

class Bar2
  include Foo
  p @var1
end

我正在尝试创建一个包含类范围配置的模块,以了解每个类的行为方式。配置存储在@@var1 和@@var2 中。使用此代码,变量在包含该模块的所有类之间共享。这不是期望的结果,我希望每个类都有自己的行为配置。

我也尝试过创建一个包含模块的类并创建变量,但是模块无法访问这些变量。

module Foo

  def m1(value)
    @@var2 << value
  end

  def m2(value)
    @@var1[@@var3]=value
  end
end

class T
  @@var1 ={}
  @@var2 =[]
  @@var3 = nil

  include foo
end

class Bar < T
  p @@var1
end

class Bar2 < T
  p @var1
end

我还读到,具有类变量的模块不是好的编码风格,但我想不出一种方法来实现我的功能......

提前感谢您的帮助

【问题讨论】:

  • 谢谢,解决了这个问题。我从真实的代码中输入了代码,但我仍然犯了很多这样的基本错误。但是测试仍然没有按照我的预期进行。

标签: ruby scope mixins


【解决方案1】:

首先 - 类变量是邪恶的,应该避免(因为它们也被所有子类继承,通常弊大于利。

您想在包含给定模块的类或模块上创建类实例变量(不是类变量)。用included方法很容易做到:

module Foo
  @default_settings = {}

  module ClassMethods
    def foo_settings
      @foo_settings
    end
  end

  def self.included(target)
    target.instance_variable_set('@foo_settings', @default_settings.dup)
    target.extend ClassMethods
  end    
end

【讨论】:

  • 谢谢。我可以再问一个问题吗? ClassMethod 模块中的方法不能从包含的类中访问。但是,如果我在 Module Foo 中添加方法,它们都可以从包含的类中访问,并且可以访问类方法。这是正确的处理方式还是我仍然错过了什么?
  • 让我添加我自己的回复,它们被包含为类方法,所以我应该从特定的类中访问它们......如果我理解正确的话。
  • 没错。 :) 如果你做class A; include Foo; end,你可以通过类本身A.foo_settings而不是它的实例来访问所有这些方法。另外,你不能打电话给Foo.foo_settings
猜你喜欢
  • 2013-08-09
  • 2022-01-17
  • 2011-02-10
  • 1970-01-01
  • 2019-09-10
  • 2014-01-20
  • 1970-01-01
  • 2016-05-14
  • 2018-04-08
相关资源
最近更新 更多