如果我想在Ruby对象之间共享数据/属性,我有哪些选项?
这里实际上有两种情况:1)对象是相同类型的(例如,所有对象都是SomeClass对象),2)对象不是相同类型的如果我想在Ruby对象之间共享数据/属性,我有哪些选项?,ruby,class,object,global,Ruby,Class,Object,Global,这里实际上有两种情况:1)对象是相同类型的(例如,所有对象都是SomeClass对象),2)对象不是相同类型的 我对案例1最感兴趣。我试图用类变量来实现这一点,但我在互联网上读了很多书,从不使用类变量(我部分同意)。实现相同功能还有哪些其他方法?为了让类中的所有对象共享数据,可以使用类变量或类实例变量 类变量在类层次结构中共享。这可能会产生副作用,可能会打破您的预期,如本例所示: class A @@common_data = :x def common_computation
我对案例1最感兴趣。我试图用类变量来实现这一点,但我在互联网上读了很多书,从不使用类变量(我部分同意)。实现相同功能还有哪些其他方法?为了让类中的所有对象共享数据,可以使用类变量或类实例变量 类变量在类层次结构中共享。这可能会产生副作用,可能会打破您的预期,如本例所示:
class A
@@common_data = :x
def common_computation
@@common_data
end
end
class B < A
@@common_data = :y
end
A.new.common_computation
# => y
B.new.common_computation
# => y
我不太确定您在寻找什么,但类变量的一个常用替代方法是类上的实例变量。实例变量不在类之间共享,而是每个类都有自己的实例变量。我想要一种方式,当我说self.foo时,我在每个对象上得到相同的结果。mixin也不是替代方案,因为它们无法初始化。关于使用类变量的警告是关于不要滥用它们。它们有适当的用途,这可能是其中之一,取决于您的应用程序。它们的存在是有原因的,并不是“完全禁止”的。本质上,它们是类的所有实例的全局变量。所以他们应该小心使用。许多结构都可以工作。请描述更多关于你正在尝试做的事情,请展示一些你已经尝试过的代码,并解释你的困境。另请参阅,这将有助于了解共享数据是在同一类的所有对象之间,还是仅在特定的选定对象之间。谢谢!但我认为你们共享的是功能,而不是实际的数据。本质上,我想实现类变量的功能,但要以一种更优雅的方式。@Filippos,如果需要,您可以共享这两种功能。模块中的方法访问的任何实例变量都将被共享。不管怎样,我想我知道你的意思。我将编辑我的答案。
class A
class << self
attr_accessor :common_data
end
def common_computation
self.class.common_data
end
self.common_data = :x
end
class B < A
self.common_data = :y
end
A.new.common_computation
# => x
B.new.common_computation
# => y
module CommonFunctionality
attr_writer :common_data
def common_computation
# use @common_data
end
end
class A
include CommonFunctionality
end
class B
include CommonFunctionality
end
a = A.new
a.common_data = :x
a.common_computation
a.is_a? B # => false
a.kind_of? CommonFunctionality # => true
b = B.new
b.common_data = :y
b.common_computation
b.is_a? A # => false
b.kind_of? CommonFunctionality # => true