Verwenden Sie den folgenden Code:
use v6d;
# sub circumfix:<α ω>( @a ) {
# @a[0] >= @a[1] & @a[0] <= @a[2];
# };
sub circumfix:<α ω>( $a, $b, $c ) {
$a >= $b & $a <= $c;
};
if (α <5 0 10> ω) {
say 'Truthy';
}
else {
say 'Falsey';
}
Ergebnisse in:
(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Too few positionals passed; expected 3 arguments but got 1
in sub circumfix:<α ω> at ./op.p6 line 7
in block <unit> at ./op.p6 line 11
Während das Umschalten des kommentierten Blocks für die andere Definition zu Folgendem führt:
(base) hsmyers@BigIron:~/board$ perl6 ./op.p6
Truthy
Die kaputte Version (mit drei Parametern) ist die, die ich möchte. Kann jemand erklären, warum sie kaputt ist?
operator-overloading
raku
hsmyers
quelle
quelle
(*@foo where .elems == 3)
die dann entwederα $a, $b, $c ω
oderα ($a, $b, $c) ω
where
Klausel, sodass Sie beispielsweise eine schönere Standardfehlermeldung und Versandgeschwindigkeit erhalten. Ich findewhere
Klauseln am besten für beliebige Bedingungen, die ein Sub-Sig nicht verarbeiten kann, oder für die Definition einer vollständig benutzerdefinierten Fehlermeldung (z( *@ where { .elems == 3 or die "nope" } )
. B. ). Beachten Sie, dass Sie diese kombinieren können:( *@ where { .elems == 3 or die "nope" } ($a, $b, $c) )
Sie erhalten eine Destrukturierung in benannte Variablen, wenn Sie die richtigen Argumente erhalten, und eine benutzerdefinierte Fehlermeldung, wenn Sie dies nicht tun.multi
s, viel besser als mein Vorschlag, einewhere
Klausel für einen Fehleranwendungsfall zu missbrauchen , der durch mehrere Signaturen ohnewhere
Klauseln unterschieden werden kann. (Im Nachhinein schäme ich mich für meine Enthüllung meiner hackigeren Instinkte, wenn sie so völlig unnötig und unangemessen wären!) Wie auch immer, haben Sie noch eine Gegenstimme und danke, dass Sie unsere Antwort mit Ihren Kommentaren verbessert haben. :)Dies sind nicht drei Argumente. Es ist eine Liste von drei Werten (vom Typ
IntStr
) und daher ein einzelnes Argument.quelle