如果我想在Ruby对象之间共享数据/属性,我有什么选择?

时间:2014-03-14 16:40:17

标签: ruby class object global

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

我最感兴趣的是案例1.我试图用类变量来实现它,但我在互联网上阅读从不使用类变量(我同意部分)。还有哪些方法可以实现相同的功能?

1 个答案:

答案 0 :(得分: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

类实例变量避免了这个问题。

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

您可以使用模块和mixin来共享功能和数据。

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