我正在尝试覆盖#new
中的MyObject
消息。问题是,当文本被编译时,局部变量disp
和oldNew
分别变为t1
和t2
(我使用的是Squeak 4.3)然后它无法将oldNew
发送给self
我可以改名字,但我不确定这是个好主意。
以下是我所拥有的基本概要:
MyObject class methodDict at: #new put:
(Object compilerClass new
compile: 'new
| disp oldNew |
oldNew := MyObject class methodDict at: #new.
disp := Dispatcher new.
^disp xxxViewedObject: self oldNew'
in: MyObject
notifying: nil
ifFail: []) generate
我不能100%确定我所做的是正确的做法,所以欢迎其他想法。
编辑:好的所以我现在意识到它正在寻找oldNew
作为MyObject
中的消息,但是我如何运行已编译的方法呢?
答案 0 :(得分:1)
显然我的问题是MyObject
是ProtoObject
的子类,现在是Object
的子类。
以下是此更改后似乎有效的代码:
MyObject class methodDict at: #new put:
(Object compilerClass new
compile: 'new
| disp |
disp := Dispatcher new.
^disp xxxViewedObject: self basicNew initialize'
in: MyObject
notifying: nil
ifFail: []) generate
答案 1 :(得分:0)
要评估新生成的编译方法,您可以使用:
aCompiledMethod valueWithReceiver: nil arguments: #()
这是一个很好的方法,但是如果你正在试验问题,我会在一个名为Grease的跨Smalltalk库中编写一个“code generator”,它对你有用。它管理自动注释,RBParser和Parser,创作和基本模板。当然,所有人都可以延长。
答案 2 :(得分:0)
生成的方法与其他方法没有什么不同。所以你只需发送方法的选择器来调用它:
var := MyObject new.