Vielleicht fehlt mir etwas, aber ich würde gerne wissen, ob es einen guten Grund gibt, warum dieser Code kompiliert werden sollte
role L {
method do-l (Int, Int --> Int ) { ... }
}
class A does L {
method do-l (Int $a, Real $b --> Str) {
.Str ~ ": Did you expect Int?" with $a + $b
}
}
my $a = A.new;
say $a.do-l: 2, 3.323
Dies wird ausgegeben
5.323: Did you expect Int?
Ich war neugierig, ob jemand einen Weg kennt, wie der Compiler zumindest eine Warnung mit der implementierten Signatur der Rolle auslösen kann L
.
...
(obwohl dies im Produktionscode sinnvoll ist, kann dies zu Verwirrung führen)
role foo {}.new
der automatisch in so etwas umgewandelt wird anon class foo does role foo {}.new
), ist so transparent, dass die Leute möglicherweise nicht erkennen, dass es sich um ein Wortspiel handelt, daher mein vorheriger Kommentar. Es ist schön, dass dieses Wortspiel im Alleingang die primäre Alternative zur Vererbung und zur Delegierung ermöglicht, nämlich das Organisieren und Konstruieren von Typen mithilfe von Kompositionen , aber imo ist es wichtig, dass die Leute nicht ganz aus den Augen verlieren, dass .new
es sich um ein Wortspiel handelt.
L.do-l
hat eine Methode, die nicht übereinstimmt, und in jedem Fall hat die Klassenmethode Vorrang, daher sollte auf beiden BasenA
sdo-l
aufgerufen werden. Das Hinzufügen von aInt
und aReal
wird a seinReal
.