Nehmen wir an, ich benutze ziemlich regelmäßig einen bestimmten Satz Boilerplate:
class Foo {
method abc($a: $b, $c, +@d) is pure {
use Slang::Bar;
…
}
method xyz($a: $b, $c, +@d) is pure {
use Slang::Bar;
…
}
method blarg($a: $b, $c, +@d) is pure {
use Slang::Bar;
…
}
}
Ich möchte lieber einfach sagen:
class Foo is/does Bar {
bar abc { … }
bar xyz { … }
bar blarg { … }
}
Und irgendwo in Bar richten Sie die Deklaration für bar ein (oder, da die Klasse Foo letztendlich selbst einen eigenen Deklarator verwendet, könnte sie woanders hingehen und muss nicht in einem separaten Typ herausgezogen werden). Wie würde ich das machen?
Antworten:
-1. Einschränkungen (nur für Pakete)
Die Methode EXPORTHOW ruft .set_how auf, wenn aktuell
$?LANG
ein Slang hinzugefügt wird.Dann ist es add_package_declarator auf die ,
MAIN
$?LANG
die ein fügtpackage_declarator
Verfahren zu seinen Aktionen und Grammatik. Ich denke, es ist der einzige "dynamische Slang" (in World.nqp).Wenn Sie route_declarator überschreiben möchten . Dann müssen Sie einen Slang schreiben, der die gerade zitierte Kette imitiert. Wenn Sie akzeptieren, das Schlüsselwort method beizubehalten und die automatische Signatur in der Klasse zu erstellen, z. B. entsprechend dem Methodennamen, haben Sie folgende Möglichkeiten:
Hinweis: Ein Paket ist ein Container (Paket, Grammatik, Modul, Rolle, Know-how, Aufzählung, Klasse, Teilmenge). Wenn Sie Code wie eine Methode einfügen, wird dieser ausgeführt (ich habe es gerade versucht):
0. Beschreibung (EXPORTHOW)
Ich würde EXPORTHOW ohne Papiere und
DECLARE
in einem Modul verwenden, weil ich mit Phaser keinen Weg gefunden habe . Anscheinend ist es auch bei BEGIN zu spät.Das Beispiel, das ich gebe, ist das Dekorieren jeder Methode in einer Klasse (gerade
BUILDALL
).1. Lib (
decorator.rakumod
)2. Ausführbar
3. Ausgabe
4. Quellen
for $_.HOW.method_table($_)
Erstellen eines neuen Hashs, der den Methodencache mit dem (gut benannten) überschreibtnqp::setmethcache
.quelle