Чи можна експортувати підмножини в Раку?


9

Я хотів би визначити кілька підмножин, до яких я також додаю кілька обмежень і деякі 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;

1
Як бічна примітка, є загальний модуль підмножини, який включає PosInt: github.com/bradclawsie/Subsets-Common
user0721090601

Відповіді:


12

Підмножини дійсно можна експортувати. Проблема тут полягає в тому, що is exportознака не належним чином застосована до PosIntпідмножини (та будь-якого іншого підмножини, яке ви, можливо, також хотіли експортувати); ознака повинна бути застосована одразу після визначення нового типу та безпосередньо перед будь-якими обмеженнями, введеними з where. Правильно застосувавши ознаку:

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

слід добре працювати:

use Long::Module::Subsets;

unit Long::Module;

# ... some code here

my PosInt $age;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.