Я хотел бы определить несколько подмножеств, к которым я также добавляю несколько ограничений и несколько die
операторов для некоторых полезных сообщений об ошибках. Я не хочу определять их в верхней части модуля, который использует эти подмножества, и вместо этого хочу поместить их в другой модуль, а также отказаться от использования их полностью определенных имен (FQN). Например, у меня есть
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 ...
но получил
===SORRY!=== Error while compiling /tmp/637321813/main.pl6
Two terms in a row ...
Это не работает, я подумал, что вместо этого я мог бы сделать что-то, как указано ниже, но мне интересно, смогу ли я избежать этого:
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;
Ответы:
Подмножества действительно могут быть экспортированы. Проблема здесь в том, что эта
is export
черта неправильно применяется кPosInt
подмножеству (и любому другому подмножеству, которое вы, возможно, также хотели бы экспортировать); Эта черта должна применяться сразу после определения нового типа и непосредственно перед любыми ограничениями, введенными сwhere
. Правильно применив черту:следующее должно работать нормально:
источник