首页 > 解决方案 > 可以在 Raku 中导出子集吗?

问题描述

我想定义一些子集,我还向其中添加一些约束和一些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;

标签: modulesubsetraku

解决方案


子集确实可以导出。这里的问题是该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;

推荐阅读