Chciałbym zdefiniować kilka podzbiorów, do których również dodam kilka ograniczeń i kilka die
instrukcji dla niektórych przydatnych komunikatów o błędach. Nie chcę ich definiować na górze modułu, który korzysta z tych podzbiorów, i zamiast tego chcę je umieścić w innym module, jednocześnie rezygnując z używania ich w pełni kwalifikowanych nazw (FQN). Na przykład mam
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 ...
ale dostałem
===SORRY!=== Error while compiling /tmp/637321813/main.pl6
Two terms in a row ...
To nie działało, pomyślałem, że zamiast tego mogę zrobić coś w następujący sposób, ale zastanawiam się, czy mógłbym tego uniknąć:
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;
Odpowiedzi:
Podzbiory można rzeczywiście eksportować. Problem polega na tym, że
is export
cecha nie jest odpowiednio zastosowana doPosInt
podzbioru (i każdego innego podzbioru, który mógłbyś również chcieć wyeksportować); cechę należy zastosować natychmiast po zdefiniowaniu nowego typu i tuż przed wprowadzeniem jakichkolwiek ograniczeńwhere
. Prawidłowe zastosowanie cechy:następujące powinny działać poprawnie:
źródło