でメソッドをスキップし、我々はあなたがMyClass new method: 1
を行う際に、いくつかの方法は条件付きでメタリンク
MyClass>>#method: arg
Transcript crShow: 'executed'
だから転写物が「実行」ラインで満たされている必要があり想像してみてください。 arg
は私が条件と代わりメタリンクをインストールしようとした0の場合
は、今私は、このメソッドをスキップする:
link := MetaLink new
condition: [ :arguments |
arguments first = 0 ]
arguments: #(arguments);
control: #instead.
(MyClass >> #method:) ast link: link
しかし、その後方法はもう実行されませんし、私がしたいですargが0
でない場合、私はまた、このようにメタオブジェクトに条件を行うことを試みたことを実行します。
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
しかし、この場合、ast compiledMethod
はコンパイルされたメソッドを返すべきだと思うが、メタリンクが何度も繰り返し呼び出されるので、無限の再帰で終わる。