Me gustaría definir algunos subconjuntos a los que también estoy agregando algunas restricciones y algunas die
declaraciones para algunos mensajes de error útiles. No quiero definirlos en la parte superior del módulo que usa esos subconjuntos y, en cambio, quiero colocarlos en otro módulo y al mismo tiempo eliminar el uso de sus nombres totalmente calificados (FQN). Por ejemplo, tengo
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 ...
pero tengo
===SORRY!=== Error while compiling /tmp/637321813/main.pl6
Two terms in a row ...
Al no funcionar, pensé que podría hacer algo de la siguiente manera, pero me pregunto si podría evitar hacerlo:
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;
Respuestas:
Los subconjuntos pueden exportarse. El problema aquí es que el
is export
rasgo no se aplica correctamente alPosInt
subconjunto (y a cualquier otro subconjunto que también haya deseado exportar); el rasgo debe aplicarse inmediatamente después de que se haya definido el nuevo tipo y justo antes de cualquier restricción introducida conwhere
. Al aplicar el rasgo correctamente:lo siguiente debería funcionar bien:
fuente