我试图在运行时添加一个方法从自我方法字典到另一个对象方法字典,但我没有成功,我试图做:
(self methodDict keys) do:[:funDec|
MyObject methodDict at: funDec put: (self methodDic at: funDec).].
我如何以正确的方式将方法字典中的方法添加到另一个方法?
这实际上是一个很好的练习,用于学习所有东西都是smalltalk中的对象:) methodDictionary中的方法只是CompiledMethods的实例,可以在很多方面使用它们,即在运行时操作类,一种反射编程方式。
至于你的问题,你的代码中只有一个小错误。而不是使用methodDict使用methodDictionary访问器,那么它应该工作正常。不应直接访问methodDict。
这是一个可以在你的pharo图像中执行的小游乐场。只需将ClassA和B替换为各自的ClassA和B.之后,您将看到复制的方法将持续存在并在浏览ClassB时保持可见。
"list methods of ClassA and ClassB"
Transcript open; clear.
Transcript show: '**ClassA methodDictionary:', String crlf.
ClassA methodDictionary associationsDo:
[:assoc | Transcript show: assoc value asString, String crlf].
Transcript show: '**ClassB methodDictionary (Before):', String crlf.
ClassB methodDictionary associationsDo:
[:assoc | Transcript show: assoc value asString, String crlf].
"Transfer all methods of ClassA to ClassB"
ClassA methodDictionary associationsDo:
[:assoc | ClassB methodDictionary at: assoc key put: assoc value].
"again .. list methods of ClassB"
Transcript show: '**ClassB methodDictionary (After):', String crlf.
ClassB methodDictionary associationsDo:
[:assoc | Transcript show: assoc value asString, String crlf].