如何让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