【问题标题】:Is it OK to store every object of certain class in one class array?可以将某个类的每个对象存储在一个类数组中吗?
【发布时间】:2011-10-13 00:23:25
【问题描述】:

是否可以创建一个类数组并将该类的每个对象保存在其中?我不确定在 Ruby 中是否有与此类似的东西或实现此目的的设计模式,所以这是我访问类的每个对象的解决方案:

class Foo
  @@all = []

  def self.all
    @@all
  end

  def initialize 
    @@all << self
  end
end

Foo.all.each do |foo|
  # do something
end

【问题讨论】:

    标签: ruby arrays oop class


    【解决方案1】:

    您可以在本地做到这一点:

    ObjectSpace.each_object(Foo) do |foo|
      # do something with foo
    end
    

    【讨论】:

    • 对象在数组中不会被销毁。这将使对象无限期地保持活动状态。
    • 但是要使用each_object,我必须保留对它的引用,对吧?
    • 你说得很好。我忘记了。我删除了我的错误,谢谢。
    • @Fábio Perez:你必须保留对什么的引用?您始终可以通过 ObjectSpace 常量访问 ObjectSpace。
    • @Chuck 到每个对象。否则,GC 会删除它。对吗?
    【解决方案2】:

    问题在于它将使类的所有实例不朽——只要它们在数组中,数组就会使它们保持活动状态。最好使用ObjectSpace.each_object(Foo)(LBg 提到)或您定期剔除的 WeakRefs 数组(这样空间效率较低)。

    如果这是一个不会使用大量数据集的短命脚本,或者您实际上想要使所有对象不朽,并且您要小心不要破坏堆,那么就没有问题了。

    【讨论】:

      【解决方案3】:

      您最终可能会在 Foo 类本身中放入过多的逻辑。相反,您可能想要创建一个 FooCollection 对象。

      如果您需要多个foo 对象的集合,这将证明特别有用。这件事发生在我身上!

      【讨论】:

      • +1 我经常从类变量中的集合开始。当我的脚本变得更复杂时,我经常以 FooCollection 对象结束。与此同时,我立即开始使用 FooCollection。
      猜你喜欢
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      相关资源
      最近更新 更多