Как ограничить количество объектов в классе указанным числом в ruby? - PullRequest
1 голос
/ 03 апреля 2010

как я могу расширить шаблон синглтона на количество объектов для класса, то есть как я могу иметь максимум 5 объектов класса, но не больше, чем в ruby ​​

Ответы [ 2 ]

4 голосов
/ 03 апреля 2010

Пример кода:

# Example class which can be instanciated at most five times
# Naive approach with Class variable

class FiveAtMost
  @@instances = 0

  def initialize()
    if @@instances >= 5
      raise "No more than five instances allowed."
    else
      @@instances += 1
    end
    p "Initialized instance #{@@instances}"
  end
end

one = FiveAtMost.new
two = FiveAtMost.new
three = FiveAtMost.new
four = FiveAtMost.new
five = FiveAtMost.new

# will raise RuntimeError: No more than five instances allowed.
six = FiveAtMost.new

Поскольку момент, когда объект получает собранный мусор , не предсказуем, вам понадобится какой-то обходной путь для этого события. Может быть, вы найдете это полезным: http://pleac.sourceforge.net/pleac_ruby/classesetc.html#AEN710

1 голос
/ 03 апреля 2010

Мультитон с ограничениями размера.

Вот наивная реализация модуля Multiton, которую вы можете включить в любой класс. Число объектов по умолчанию, которое он может создать, равно 5, и вы можете переопределить это ограничение, определив метод класса с именем max_instances, который возвращает число (максимально допустимое количество экземпляров) в вашем классе.

module Multiton

  MAX_INSTANCES = 5
  COUNT_HOOK = :max_instances

  module MultitonClassMethods
    def instance
      size = @instances.size
      max = respond_to?(COUNT_HOOK) ? self.send(COUNT_HOOK) : MAX_INSTANCES
      @instances << new if size < max
      @instances[rand(size)]
    end
  end

  def self.included(klass)
    klass.class_eval {
      @instances = []
    }
    klass.private_class_method :new
    klass.extend(MultitonClassMethods)
  end

end

Включите модуль в класс, чтобы сделать его многотонным.

# Falls back to Multiton::MAX_INSTANCES 
class Person
  include Multiton
end

# Overrides the number of allowed instances in max_instances
class Resource
  include Multiton

  def self.max_instances
    58
  end
end

Поскольку объекты возвращаются случайным образом из пула в этом мультитоне, вы не сможете вернуть все объекты за короткий промежуток времени. Но по мере того, как запрашивается больше объектов, он должен выравниваться. Вы можете изменить это поведение в модуле Multiton, периодически переключаясь между объектами, а не выбирая их случайным образом.

people = []
1000.times do
  people << Person.instance
end
# should print 5, but may print a smaller number
p people.uniq.size

resources = []
1000.times do
  resources << Resource.instance
end
# should print 58, but may print a smaller number
p resources.uniq.size
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...