サブセットをRakuにエクスポートできますか?


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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.