ruby中的模块和类变量范围

时间:2014-02-03 18:10:29

标签: ruby scope mixins

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

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

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

我还读过,拥有类变量的模块并不是很好的编码风格,但我想不出用这种方式实现我的功能......

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:0)

首先 - 类变量是邪恶的,应该避免(因为它们也被所有子类继承,并且通常造成的危害大于好处。

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