如何让ruby与extend一起共享类及其子类的数据
@f是a和B的类变量吗?如何让ruby与extend一起共享类及其子类的数据,ruby,class,module,extend,Ruby,Class,Module,Extend,@f是a和B的类变量吗? 如何仅通过将变量写入M来共享a和B之间的变量?类变量可以满足您的需要: 42 nil 这似乎更接近您想要的行为: 42 42 B::A.f将生成正确的结果,方法是不直接使用@f,而是使用class_variable_set()和class_variable_get(),可以从M中使用A、B和C的类变量 42 42 23 42 42 如您所见,变量由A和B共享,但不是C。类变量现在属于M而不是A或B,因此它由扩展的所有类共享。但是它应该只被所有子类和类本身
如何仅通过将变量写入M来共享a和B之间的变量?类变量可以满足您的需要:
42
nil
这似乎更接近您想要的行为:
42
42
B::A.f将生成正确的结果,方法是不直接使用@f,而是使用class_variable_set()和class_variable_get(),可以从M中使用A、B和C的类变量
42
42
23
42
42
如您所见,变量由A和B共享,但不是C。类变量现在属于M而不是A或B,因此它由扩展的所有类共享。但是它应该只被所有子类和类本身模块M@@f=nil def f=(x)共享@@f=x end def f@@f end end end class A extend M end class C extend M end A.f=42 C.f=23 puts A.f puts C.f PRODUCTS 23如果要在这样的(子)类之间共享数据,它必须通过a)类变量或b)更复杂的挂钩。实例变量(单个
@
)从来都不是类变量,无论从谁的角度来看(它们位于不同的位置,具有不同的作用域)。但是如何通过扩展M来获得a的类变量。您的解决方案创建了M而不是a的类变量。某种形式的评估将是唯一的方法。“必须使用扩展”是一条硬性规定吗?我想把它做成一个模块,这样它就可以在不同的类中使用。Extend或include是扩展类的标准方法,我宁愿使用其中一种,也不愿做一些难看的事情。警告:顶级常量A被B::A引用
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
A.f= 42
puts A.f
puts B.f
C.f = 23
puts C.f
puts A.f
puts B.f
42
42
23
42
42
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
A.f= 42
C.f= 23
puts A.f
puts B.f
puts C.f
42
42
23