6
votes

Appliquer une vérification spécifique (au-delà des types d'orignaux) à l'attribut Moose

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 'A' code>, 'B' code> ou 'c' code> ou seulement une devise symbole, ou doit être conforme à une expression régulière.

Regardez l'exemple suivant qui a deux attributs contraints, il faut être soit '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;


1 commentaires

Réponse: Utilisez vos propres types.


3 Réponses :


6
votes

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;


5 commentaires

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'); ?


J'ai fini en utilisant Moose :: util :: typeconstraints , 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 diffère un peu de celui présenté dans votre exemple. Il y a aussi Enum que j'ai trouvé entre utile. Merci beaucoup!


Je dois faire une correction. La syntaxe de Brad pour sous-type était bien bien. J'ai renversé les haricots en écrivant sous-type as => 'str', où => {...} , 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 ' (incorrect) au lieu de comme" str' (à droite).



3
votes

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 );


3 commentaires

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 , 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.



0
votes

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é): xxx pré>

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$/ ]);


1 commentaires

Merci, je vais jeter un coup d'oeil. Demain :-)