Comment prolonger le motif de singleton à un certain nombre d'objets à une classe à-dire comment puis-je avoir seulement cinq objets d'une classe au maximum et pas plus que dans le rubisComment limiter le nombre d'objets d'une classe à un nombre donné dans ruby?
Répondre
Multiton avec des contraintes de taille.
Voici une implémentation naïve d'un module Multiton que vous pouvez inclure dans n'importe quelle classe. Le nombre par défaut d'objets qu'il peut créer est 5, et vous pouvez remplacer cette limite en définissant une méthode de classe appelée max_instances
qui renvoie un nombre (nombre maximal d'instances autorisé) dans votre classe.
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
Inclure le module dans une classe pour en faire une multiton.
# 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
Puisque les objets sont retournés au hasard d'une piscine dans ce multiton, vous ne pouvez pas obtenir tous les objets en arrière sur un court terme. Mais comme plus d'objets sont demandés, il devrait égaliser. Vous pouvez modifier ce comportement dans le module Multiton
en parcourant les objets au lieu d'en sélectionner un au hasard.
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
code Exemple:
# 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
Depuis le moment où un objet se déchets collectés n'est pas prévisible, vous aurez besoin d'une sorte de solution de contournement pour le cet événement. Peut-être que vous trouvez cela utile: http://pleac.sourceforge.net/pleac_ruby/classesetc.html#AEN710
Je suppose que vous gardez les instances créées dans un tableau (dans la variable de classe, qui pourrait être utilisée à la place de '@@ instances' pour la limitation d'instanciation aussi bien) empêcherait la collecte des ordures? –
Oui, j'ai appelé mon approche naïve. Avec votre suggestion et un finaliseur personnalisé, cela peut être une bonne solution. Si vous aimez (et pouvez), éditez mon post, puisque je suis à court de temps en ce moment. – miku
- 1. Comment limiter le nombre d'emails à envoyer
- 2. Comment limiter un nombre à une gamme
- 3. Comment détecter si un nombre donné est un nombre entier?
- 4. limiter le nombre d'images à la suite?
- 5. ASP.NET Limiter le nombre téléchargement
- 6. Comment puis-je limiter le nombre d'inscrits à un événement?
- 7. Comment limiter le nombre de processus?
- 8. Limiter le nombre de caractères dans JTextField
- 9. Limiter le nombre de résultats dans JPQL
- 10. Limiter le nombre de caractères dans l'entrée
- 11. Comment limiter le nombre de résultats obtenus?
- 12. Limiter le nombre de révisions dans Couchdb
- 13. trouver la décimale dans un nombre donné
- 14. Recherche d'un nombre premier après un nombre donné
- 15. comment limiter le nombre de données dans le mot
- 16. Limiter le nombre de processus créés
- 17. Limiter le nombre de sections de configuration
- 18. Compter le nombre d'utilisateurs d'un pays donné
- 19. comment limiter le nombre de travaux PBS en cours d'exécution
- 20. Limiter le nombre d'entrées dans un contrôle de liste MFC
- 21. Comment limiter le nombre d'éléments affichés dans html.dropdownlist?
- 22. FLEX: comment limiter le nombre d'éléments dans l'objet Repeater
- 23. Comment limiter le nombre d'instances d'un service WCF dans IIS?
- 24. Comment limiter le nombre d'entrées dans une liste java?
- 25. Comment limiter le nombre d'éléments itérés dans une boucle foreach?
- 26. imap_search limiter le nombre de messages retournés
- 27. jQuery Sortable - Limiter le nombre d'éléments dans la liste
- 28. Limiter le nombre de résultats sur un ListView ASP.NET
- 29. Comment limiter le nombre d'éléments perdus pour une boîte?
- 30. Comment limiter le nombre de valeurs de publication sur UpdatePanel?
Vous répétez simplement sa question. – johannes
merci de me montrer l'erreur de mes façons johannes. J'essayais juste de ratisser quelques points gratuits: P. permettez-moi d'ajouter plus à la réponse maintenant – Anurag
juste un doute cela sera thread sûr? –