【发布时间】:2016-10-23 07:20:55
【问题描述】:
假设我们有一些方法
MyClass>>#method: arg
Transcript crShow: 'executed'
因此,当您执行MyClass new method: 1 时,成绩单中会充满“已执行” 行。
现在,如果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 应该返回一个编译的方法而不是反射对应的方法
【问题讨论】:
标签: reflection pharo