我正在尝试重构和一些自定义功能。有没有办法将方法复制到与原始类相同的类但以新名称? (基本上创建一个非常浅的副本)您可以通过编辑方法源手动完成此操作,但是可以以编程方式完成吗?
例如:
doMethodName: anArgument
^ anObject doThat with: anArgument
变为:
doNewMethodName: anArgument
^ anObject doThat with: anArgument
答案 0 :(得分:3)
您可以通过向目标类发送compile:
消息来编译方法。
method := Float>>#cos
或method := Float methodNamed: #cos
检索源代码
method sourceCode
会将方法代码作为字符串method ast
(或method parseTree
)会将代码作为已解析的树表示返回将代码编译到类中(可选择使用协议)
TargetClass compile: sourceCode
或TargetClass compile: sourceCode classified: protocol
所以,如果你有
Something>>doMethodName: anArgument
^ anObject doThat with: anArgument
你可以做到
code := (Something>>#doMethodName:) sourceCode.
"replace all matches"
newCode := code copyReplaceAll: 'doMethodName:' with: 'doNewMethodName:'.
"or just the first"
newCode := code copyWithRegex: '^doMethodName\:' matchesReplacedWith: 'doNewMethodName:'.
Something compile: newCode.
sourceCode
将代码作为字符串返回,这不是最好的操作。
如果您只想更改方法名称,可以在AST中重命名,例如
tree := (Something>>#doMethodName:) parseTree.
tree selector: 'doNewerMethodName:'.
Something compile: tree newSource.