繁体   English   中英

如何在吱吱声中动态更改方法的名称?

[英]How do I change a method's name dynamically in squeak?

我有一个类,我想在运行时更改特定方法的名称。 我猜“行为”类中有一个方法可以做到这一点。 但是我只是找不到。 有什么帮助吗? [吱吱声]

用户执行此操作的通常方法是修改方法源并“接受”,然后删除旧版本。 因此,基本的Squeak不太可能包含单一方法来执行此操作,尽管我可能是错的。

但是,例如,如果您安装OmniBrowser,则有一个名为“ rename”的方法重构,您可以检查并找到执行该重构的代码。 这是相当复杂的,首先是因为重构是使用命令模式完成的,而命令模式需要进行一些重定向,但是其次是因为这是相当复杂的重构,其中包括修改调用站点。

您的建议给我带来了巨大的危险。 您正在尝试完成什么?

您是否要更改运行时正在调用的方法的名称? 如果是这样,那很容易。

做类似的事情:

|methodName|
methodName :=  self useMethod1 ifTrue: [#method1 ] ifFalse:[ #method2 ].
self perform: methodName.

您最好使用重构

r := RenameMethodRefactoring 
    renameMethod: #foo:foo: 
    in: Foo
    to: #bar:bar:
    permutation: (1 to: #foo:foo: numArgs). 
r execute.

尽可能避免使用真实代码中的巫毒魔法。

话虽如此,您可以通过动态地操作方法来做一些非常有趣的事情。

例如,Etoys中的代码块被转换为Smalltalk方法。 其他DSL实现也可以从类似的元编程技巧中受益。

经过试验后,我想到了以下代码来重命名一元方法:

renameMethod: oldMethod inClass: class to: newMethod
| oldSelector newSelector source parser |

oldSelector := oldMethod asSymbol.
newSelector := newMethod asSymbol.
oldSelector = newSelector ifTrue: [^self].

"Get method category"
category := (LocatedMethod location: class selector: oldSelector) category.

"Get method source code"
source := class sourceCodeAt: oldSelector.

"Replace selector in method source" 
(parser := class parserClass new) parseSelector: source.
source := (newSelector asString), (source allButFirst: parser endOfLastToken).

"Compile modified source"
class compile: source classified: category.

"Remove old selector"
class removeSelector: oldSelector

如果通过Squeak代码浏览的时间比我浏览的时间长一点,则可能会找到一种更简便的方法。

实际上,您无法更改方法的名称,因为它没有名称。

对象的方法字典将符号映射到CompiledMethods。 “更改方法的名称”的意思是“将CompiledMethod值从此键移动到该键”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM