Je délègue actuellement la méthode du générateur à tous les objets qui étendent l'une de mes classes de base. Le problème auquel je suis confronté est que j'ai besoin que tous les objets lisent un attribut de lui-même ou soient passés dans une valeur. Est-ce actuellement possible ou est-ce que je vais devoir le faire d'une autre manière?Argument du sous-programme générateur dans un objet moose
Répondre
Vous ne pouvez pas passer d'arguments aux méthodes de génération d'attributs. Ils sont appelés automatiquement par les internes de Moose et ne transmettent qu'un seul argument, la référence d'objet elle-même. Le générateur doit être en mesure de renvoyer sa valeur en fonction de ce qu'il voit dans $self
ou toute autre chose dans l'environnement auquel il a accès.
Quel genre d'arguments voudriez-vous transmettre au constructeur? Pouvez-vous plutôt transmettre ces valeurs au constructeur d'objet et les stocker dans d'autres attributs?
# in object #2:
has other_attr_a => (
is => 'ro', isa => 'Str',
);
has other_attr_b => (
is => 'ro', isa => 'Str',
);
sub _builder
{
my $self = shift;
# calculates something based on other_attr_a and other_attr_b
}
# object #2 is constructed as:
my $obj = Class2->new(other_attr_a => 'value', other_attr_b => 'value');
Notez également que si vous avez des attributs qui sont construits en fonction de d'autres valeurs d'attribut, vous devez les définir comme lazy
, sinon les constructeurs/défaut fonctionneront immédiatement sur la construction de l'objet, et dans un ordre indéfini. Les placer paresseux retardera leur définition jusqu'à ce qu'ils soient d'abord nécessaires.
Je devais juste mettre paresseux et tout s'est parfaitement déroulé. Dans mon test d'origine, je n'avais pas cet ensemble, donc je ne pouvais pas voir les autres attributs dans ma méthode de construction. Merci! – lespea
@lespea: doux! heureux d'entendre tout cela a fonctionné pour vous! :) – Ether
Vous pouvez faire quelque chose comme ceci:
has 'attr' => (
isa => 'Str',
is => 'ro',
builder => '_pre_builder',
);
sub pre_builder {
_builder(@_, 'your_arg');
}
- 1. expansion du répertoire (~) dans un argument
- 2. Moose: Charger l'objet du fichier dans la méthode BUILD
- 3. accéder à un Moose Array
- 4. Singleton Roles in Moose
- 5. Moose structured types
- 6. Un rôle Moose des rôles
- 7. Comment remplacer une méthode d'un objet Moose lors de l'exécution?
- 8. Transmet un objet C# de type HashTable en argument
- 9. Comment gérer les paramètres optionnels dans Moose?
- 10. Moose coercion and builders
- 11. Perl Moose accessor Moose - ne peut pas définir uniquement un lecteur ou lecteur accesseur!
- 12. Comment créer une nouvelle classe Moose et instancier un objet de cette classe lors de l'exécution?
- 13. Comment puis-je convertir un objet Moose existant en instance étendue?
- 14. Comment stocker et compresser un objet Moose à l'aide de Perl?
- 15. Rails 3: `require` dans un générateur
- 16. Supprimer un objet du tableau dans NSTableView
- 17. Moose: l'exportateur extensible provoque la disparition du constructeur?
- 18. Génération d'itinéraires imbriqués dans un générateur personnalisé
- 19. l'ajout d'un objet jquery renvoie un argument non valide dans IE
- 20. enumerate() - un générateur en Python
- 21. Python optparse et espaces dans un argument
- 22. L'option git du générateur Rails 3?
- 23. Générateur de nombres aléatoires non biaisé utilisant un générateur biaisé
- 24. Comment passer un argument au gestionnaire d'événement dans tkinter?
- 25. Supprimer un objet du tableau
- 26. générateur de générateur de fonds
- 27. Problème du générateur de séquence Oracle hibernate
- 28. Spécification du type spécifique d'un délégué Argument
- 29. appel carte :: trouver un argument const
- 30. Question du générateur de thème jquery
Je vais avoir du mal à comprendre exactement ce que vous essayez d'atteindre, d'expliquer peut-être du point de vue du consommateur? –