Ruby中的模块和类变量范围



我仍在尝试清楚地理解模块/class/实例变量...

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

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

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

事先感谢您的任何帮助

首先 - 班级变量是邪恶的,应该避免(因为它们也被所有子类遗传,通常造成的弊大于好。

您想在包括给定模块的类或模块上创建类实例变量(不是类变量)。使用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

最新更新