-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ügt package_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
)
class DecoratedClassHOW is Metamodel::ClassHOW {
method add_method(Mu $obj, $name, $code_obj) {
sub wrapper ($obj, $a, $b) {
say "Before $name";
my $res = $code_obj($obj, $a, $b);
say "After $name";
return $res;
}
my $res = callwith($obj, $name, &wrapper);
return $res;
}
}
my module EXPORTHOW {
package DECLARE {
constant decorated = DecoratedClassHOW;
}
}
2. Ausführbar
use lib '.';
use decorator-lib;
decorated Foo {
method abc($a, $b) {
say "In abc: $a:$b";
}
}
my $f = Foo.new;
$f.abc(1, 2);
3. Ausgabe
Before BUILDALL
After BUILDALL
Before abc
In abc: 1:2
After abc
4. Quellen