Можно ли хранить каждый объект определенного класса в одном массиве классов? - PullRequest
0 голосов
/ 26 июля 2011

Можно ли создать массив классов и сохранить в нем каждый объект этого класса? Я не уверен, есть ли что-то похожее на это изначально в Ruby или в шаблоне разработки, который выполняет это, так что это мое решение для доступа к каждому объекту класса:

class Foo
  @@all = []

  def self.all
    @@all
  end

  def initialize 
    @@all << self
  end
end

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

Ответы [ 3 ]

3 голосов
/ 26 июля 2011

Вы можете сделать это, изначально:

ObjectSpace.each_object(Foo) do |foo|
  # do something with foo
end
1 голос
/ 26 июля 2011

В конечном итоге вы можете поместить слишком много логики в сам класс Foo. Вместо этого вы можете создать объект FooCollection.

Это окажется особенно полезным, если вам понадобится несколько коллекций foo объектов. Это случилось со мной!

1 голос
/ 26 июля 2011

Проблема в том, что он сделает все экземпляры класса бессмертными - массив сохранит их живыми, пока они в нем.Лучше использовать ObjectSpace.each_object(Foo) (упомянутое LBg) или массив WeakRef, которые вы периодически отбираете (это менее эффективно использует пространство).

Если это для краткосрочного сценария, который неиспользуя огромные наборы данных, или вы на самом деле хотите сделать все объекты бессмертными, и вы будете осторожны, чтобы не взорвать кучу, тогда нет проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...