I sottoinsiemi possono essere esportati in Raku?


9

Vorrei definire alcuni sottoinsiemi a cui sto aggiungendo anche alcuni vincoli e alcune diedichiarazioni per alcuni utili messaggi di errore. Non voglio definirli nella parte superiore del modulo che utilizza quei sottoinsiemi e invece voglio inserirli in un altro modulo, eliminando anche l'uso dei loro nomi completi (FQN). Per esempio, ho

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

ma ottenuto

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

Non funzionando ho pensato che avrei potuto fare qualcosa come segue, ma mi chiedo se potrei evitare di farlo:

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
Come nota a margine, esiste un modulo di sottoinsiemi comuni che include PosInt: github.com/bradclawsie/Subsets-Common
user0721090601

Risposte:


12

I sottoinsiemi possono infatti essere esportati. Il problema qui è che il is exporttratto non è applicato correttamente al PosIntsottoinsieme (e qualsiasi altro sottoinsieme che potresti anche voler esportare); il tratto deve essere applicato immediatamente dopo aver definito il nuovo tipo e subito prima di introdurre eventuali vincoli where. Applicando correttamente il tratto:

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

il seguente dovrebbe funzionare bene:

use Long::Module::Subsets;

unit Long::Module;

# ... some code here

my PosInt $age;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.