uzl*_*xxx 9 module subset 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 ...
Run Code Online (Sandbox Code Playgroud)
但得到
===SORRY!=== Error while compiling /tmp/637321813/main.pl6
Two terms in a row ...
Run Code Online (Sandbox Code Playgroud)
那不起作用我想我可以做以下事情,但我想知道我是否可以避免这样做:
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;
Run Code Online (Sandbox Code Playgroud)
uzl*_*xxx 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 ...
Run Code Online (Sandbox Code Playgroud)
以下应该可以正常工作:
use Long::Module::Subsets;
unit Long::Module;
# ... some code here
my PosInt $age;
Run Code Online (Sandbox Code Playgroud)