如何让ruby与extend一起共享类及其子类的数据

如何让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,因此它由扩展的所有类共享。但是它应该只被所有子类和类本身

@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@@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