Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我想在Ruby对象之间共享数据/属性,我有哪些选项?_Ruby_Class_Object_Global - Fatal编程技术网

如果我想在Ruby对象之间共享数据/属性,我有哪些选项?

如果我想在Ruby对象之间共享数据/属性,我有哪些选项?,ruby,class,object,global,Ruby,Class,Object,Global,这里实际上有两种情况:1)对象是相同类型的(例如,所有对象都是SomeClass对象),2)对象不是相同类型的 我对案例1最感兴趣。我试图用类变量来实现这一点,但我在互联网上读了很多书,从不使用类变量(我部分同意)。实现相同功能还有哪些其他方法?为了让类中的所有对象共享数据,可以使用类变量或类实例变量 类变量在类层次结构中共享。这可能会产生副作用,可能会打破您的预期,如本例所示: class A @@common_data = :x def common_computation

这里实际上有两种情况:1)对象是相同类型的(例如,所有对象都是SomeClass对象),2)对象不是相同类型的


我对案例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