我仍在尝试清楚地理解模块/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