【问题标题】:How to get class instances in Ruby? [duplicate]如何在 Ruby 中获取类实例? [复制]
【发布时间】:2011-06-15 23:30:53
【问题描述】:

假设我有一个名为 Post 的类,它有许多已启动的实例(即 Post.new(:name => 'foo'))。

有没有办法通过调用某个类来检索该类的所有实例? 我正在寻找类似于Post.instances.all

的东西

【问题讨论】:

  • 您可能可以手动存储从构造函数更新的参考列表...但我很好奇您为什么需要这样做?

标签: ruby ruby-on-rails-3


【解决方案1】:

您可以使用ObjectSpace 检索给定类的所有实例化对象:

posts = []
ObjectSpace.each_object Post do |post|
  posts << post
end

这几乎肯定是个坏主意,但是 - 例如,它还会从尚未被垃圾收集的早期请求加载仍在内存中的 Post 实例。可能有更好的方法来获取您关心的帖子,但我们需要更多关于您想要做什么的信息。

【讨论】:

    【解决方案2】:

    说明 alphazero 和 PreciousBodyFluids 的答案:

    class Foo
      @@instance_collector = []
      def initialize
        @@instance_collector << self
        #other stuff
      end
      def self.all_offspring
        @@instance_collector
      end
    end
    
    a = Foo.new
    b = Foo.new
    
    p Foo.all_offspring  # => [#<Foo:0x886d67c>, #<Foo:0x886d668>]
    p ObjectSpace.each_object(Foo).to_a # => [#<Foo:0x886d668>, #<Foo:0x886d67c>] #order is different
    

    【讨论】:

    • 如果一个实例被破坏了,这个@@instance_collector会被更新吗?
    • @Vijay 的简短回答是否定的,因为没有 LOC 从数组中删除对象。
    【解决方案3】:

    覆盖新的;数数;暴露财产。

    【讨论】:

    • +1 简短、甜美、中肯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2019-01-03
    • 2013-06-07
    • 1970-01-01
    相关资源
    最近更新 更多