Können Teilmengen in Raku exportiert werden?


9

Ich möchte einige Teilmengen definieren, zu denen ich auch einige Einschränkungen und einige dieAnweisungen für einige nützliche Fehlermeldungen hinzufüge . Ich möchte sie nicht oben im Modul definieren, das diese Teilmengen verwendet, sondern sie in einem anderen Modul platzieren und gleichzeitig die Verwendung ihrer vollqualifizierten Namen (FQNs) vermeiden. Zum Beispiel habe ich

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

aber bekam

===SORRY!=== Error while compiling /tmp/637321813/main.pl6
Two terms in a row ...

Das funktioniert nicht Ich dachte, ich könnte stattdessen etwas wie folgt tun, aber ich frage mich, ob ich es vermeiden könnte:

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
Als Randnotiz gibt es ein allgemeines Teilmengenmodul, das PosInt enthält: github.com/bradclawsie/Subsets-Common
user0721090601

Antworten:


12

Teilmengen können tatsächlich exportiert werden. Das Problem hierbei ist, dass das is exportMerkmal nicht ordnungsgemäß auf die PosIntTeilmenge angewendet wird (und auf jede andere Teilmenge, die Sie möglicherweise auch exportieren möchten). Das Merkmal muss unmittelbar nach der Definition des neuen Typs und unmittelbar vor den mit eingeführten Einschränkungen angewendet werden where. Durch korrektes Anwenden des Merkmals:

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

Folgendes sollte gut funktionieren:

use Long::Module::Subsets;

unit Long::Module;

# ... some code here

my PosInt $age;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.