如何让ruby与一个类共享数据,并将其子类与extend结合使用
module M def f=(x) @f= x end def f @f end end class A extend M end class B < A end Af= 42 puts Af puts Bf
这会产生
42 nil
@fa类变量是否为A和B? 如何仅通过将其写入M来共享A和B之间的变量?
通过不直接使用@@ f,而是使用class_variable_set()和class_variable_get(),可以在M内使用A,B和C的类变量。
module M def f=(x) class_variable_set("@@f", x) end def f class_variable_get("@@f") end end class A extend M end class B < A end class C extend M end Af= 42 Cf= 23 puts Af puts Bf puts Cf
这会产生
42 42 23
如您所见,变量由A和B共享,但不是C.
B :: Af将产生正确的结果
类变量可以在这里做你需要的:
module M def f=(x) @@f= x end def f @@f end end class A extend M end class B < A end Af= 42 puts Af puts Bf
这会产生:
42 42
这似乎更接近你想要的行为:
def M() m = Module.new m.module_eval <<-HERE def f=(x) @@f= x end def f @@f end HERE m end class A extend M() end class B < A end class C extend M() end Af= 42 puts Af puts Bf Cf = 23 puts Cf puts Af puts Bf
生产:
42 42 23 42 42