types d'orignal sont super, mais parfois vous besoin d'être plus précis. Vous connaissez tous ces règles de type de données: ce paramètre ne peut être que Regardez l'exemple suivant qui a deux attributs contraints, il faut être soit 'A' code>,
'B' code> ou
'c' code> ou seulement une devise symbole, ou doit être conforme à une expression régulière.
'M' code> ou
'F' Code >, l'autre doit être une date d'ISO valide. Quelle est la meilleure façon à Moose de spécifier ces contraintes? Je penserais à la clause SQL
Cochez CODE> CLAUSE, mais AFAICS Il n'y a pas de
Vérifiez code> mot-clé à Moose. J'ai donc utilisé
déclencheur code>, mais cela semble faux. Tout le monde a une meilleure réponse? P>
package Blabla::Customer;
use Moose::Util::TypeConstraints;
use Moose;
subtype ISODate => as 'Str' => where { /^\d\d\d\d-\d\d-\d\d$/ };
has id => is => 'rw', isa => 'Str';
has gender => is => 'rw', isa => enum ['m', 'f'];
has firstname => is => 'rw', isa => 'Str';
has dateOfBirth => is => 'rw', isa => 'ISODate';
no Moose;
__PACKAGE__->meta->make_immutable;
3 Réponses :
Définissez simplement votre propre sous-type et utilisez-le.
package Person: use MooseX::Types::Moose qw'Str'; use Person::TypeConstraints qw'Gender ISODate'; use namespace::clean; use Moose; has gender => ( is => 'rw', isa => Gender, ); has name => ( is => 'rw', isa => Str, ); has dateOfBirth => ( is => 'rw', isa => ISODate, ); no Moose; __PACKAGE__->meta->make_immutable; 1;
Je dois dire que la dépendance du type «Str '» lorsque Moose a une énumérum typeconstraint me confondre. Qu'est-ce qui ne va pas avec a genre => (ISA => Enum ([qw | m m f f f |]), est => 'ro'); code>?
J'ai fini en utilisant Moose :: util :: typeconstraints code>, qui présente l'avantage d'être déjà installé sur le système cible (que je ne contrôle pas). Je suis sûr que les autres suggestions sont également intéressantes. Vérifiez mon message initial où je vais poster une mise à jour lorsque la syntaxe pour appeler
sous-type code> diffère un peu de celui présenté dans votre exemple. Il y a aussi
Enum code> que j'ai trouvé entre utile. Merci beaucoup!
Je dois faire une correction. La syntaxe de Brad pour sous-type code> était bien bien. J'ai renversé les haricots en écrivant
sous-type as => 'str', où => {...} code>, ce qui ne va pas, ou obsolète. C'est un peu délicat celui-ci veut être épelé différemment des modificateurs d'attributs.
@Lumi où {/./poracle_ / code> est identique à
où SUB {/./OPELA_/ code> qui retourne
{où => sous {/./}} < / code>
J'ai bâclé la première partie: as => "str ' code> (incorrect) au lieu de
comme" str' code> (à droite).
Ajout de votre propre type comme Brad dit:
use Moose::Util::TypeConstraints; my $gender_constraint = subtype as 'Str', where { $_ =~ /^[FfMm]$/ }; has gender => ( is => 'rw', isa => $gender_constraint );
C'est une façon de le faire, mais cela n'a aucun sens que si vous allez l'utiliser plus d'une fois, et seulement dans un seul fichier. Je recommanderais d'utiliser Moosex :: Types Si vous envisagez d'utiliser les mêmes contraintes sur plus d'un fichier.
Merci. Bien que Brad ne semble pas être d'accord à 100%, je pense que c'est bien de stocker et de réutiliser la valeur de retour du sous-type code>, même si elle pourrait être confinée à une portée. Peut-être que c'est ce que vous avez l'intention?
@ Michael-Ludwig Oui, j'ai souvent des choses comme $ abs_int et telles qui sont utilisées à plusieurs endroits d'une classe, alors je trouve que cela fonctionne bien pour cela. Brad a raison pour que Moosex :: Types est génial si vous utilisez les mêmes contraintes dans plusieurs fichiers et que la sous-typing en ligne est bonne pour une seule contrainte.
Vous pouvez essayer d'utiliser Types de Moosex- Paraméalisable pour mettre en œuvre des types qui prennent des paramètres pour les cas que vous présentez (non testé, juste esquissé): et vous l'utiliseriez comme ceci: p> use YourTypes qw( OneOfStr MatchingStr );
has gender => (is => 'ro', isa => OneOfStr[ [qw( f m )] ]);
has dob => (is => 'ro', isa => MatchingStr[ qr/^$yourregex$/ ]);
Merci, je vais jeter un coup d'oeil. Demain :-)
Réponse: B> Utilisez vos propres types.