Les sous-ensembles peuvent-ils être exportés dans Raku?


9

Je voudrais définir quelques sous-ensembles auxquels j'ajoute également quelques contraintes et quelques dieinstructions pour certains messages d'erreur utiles. Je ne veux pas les définir en haut du module qui utilise ces sous-ensembles et je veux plutôt les placer dans un autre module tout en supprimant l'utilisation de leurs noms complets (FQN). Par exemple, j'ai

unit module Long::Module::Subsets;

subset PosInt
where ($_ ~~ Int || "The value must be an integer")
   && ($_ > 0    || "The value must be greater than 0")
is export
;

# other subsets ...

mais j'ai

===SORRY!=== Error while compiling /tmp/637321813/main.pl6
Two terms in a row ...

Cela ne fonctionnait pas, j'ai pensé que je pouvais faire quelque chose comme suit, mais je me demande si je pourrais éviter de le faire:

use Long::Module::Subsets;

unit Long::Module;

my constant PosInt = Long::Module::Subsets::PosInt;
my constant Byte   = Long::Module::Subsets::Byte;
# ... more subsets here

# ... some code here

my PosInt $age;

1
En remarque, il existe un module de sous-ensembles commun qui comprend PosInt: github.com/bradclawsie/Subsets-Common
user0721090601

Réponses:


12

Les sous-ensembles peuvent en effet être exportés. Le problème ici est que le is exporttrait n'est pas correctement appliqué au PosIntsous - ensemble (et à tout autre sous-ensemble que vous auriez également souhaité exporter); le trait doit être appliqué immédiatement après la définition du nouveau type et juste avant toute contrainte introduite avec where. En appliquant correctement le trait:

unit module Long::Module::Subsets;

subset PosInt is export
where ($_ ~~ Int || "The value must be an integer")
   && ($_ > 0    || "The value must be greater than 0")
;

# other subsets ...

les éléments suivants devraient fonctionner correctement:

use Long::Module::Subsets;

unit Long::Module;

# ... some code here

my PosInt $age;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.