Stellen wirBedingtes ein Verfahren mit METALINKS überspringen
MyClass>>#method: arg
Transcript crShow: 'executed'
So eine Methode haben, wenn Sie MyClass new method: 1
tun das Transkript mit „ausgeführt“ Linien gefüllt ist.
Jetzt möchte ich diese Methode überspringen, wenn arg
ist 0. Ich habe versucht, eine statt metalink mit einer Bedingung zu installieren:
link := MetaLink new
condition: [ :arguments |
arguments first = 0 ]
arguments: #(arguments);
control: #instead.
(MyClass >> #method:) ast link: link
Aber dann geht das Verfahren läuft nicht mehr, und ich möchte führen sie es, wenn die arg nicht 0
I habe auch den Zustand, in dem Metaobjekt auf diese Weise zu tun versucht:
link := MetaLink new
metaObject: [ :ast :arguments :receiver |
arguments first = 0
ifFalse: [
ast compiledMethod
valueWithReceiver: receiver
arguments: arguments ] ];
selector: #value:value:value:;
arguments: #(node arguments receiver);
control: #instead.
(MyClass >> #method:) ast link: link
Aber in diesem Fall enden Sie in einer unendlichen Rekursion, da der Metalink immer wieder aufgerufen wird, obwohl ich dachte, dass ast compiledMethod
eine kompilierte Methode zurückgeben sollte und nicht das reflektierende Gegenstück