2

クラスがあり、実行時に特定のメソッドの名前を変更したいと考えています。「Behavior」クラスにそれを行うメソッドがあると思います。しかし、私はそれを見つけることができません。助けはありますか?【きしむ】

4

5 に答える 5

2

あなたが提案していることは、私にとって大きな危険信号です。これで何を達成しようとしているのですか?

実行時に呼び出しているメソッドの名前を変更したいということですか? もしそうなら、それは簡単です。

次のようにします。

|methodName|
methodName :=  self useMethod1 ifTrue: [#method1 ] ifFalse:[ #method2 ].
self perform: methodName.
于 2009-05-19T20:28:37.363 に答える
0

可能な場合は、実際のコードでブードゥーマジックを避けてください。

そうは言っても、メソッドを動的に操作することで、非常に興味深いことができます。

たとえば、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コードを参照すると、おそらくこれを行うためのより簡単な方法を見つけることができます。

于 2009-12-18T06:31:11.533 に答える
0

メソッドには名前がないため、実際にはメソッドの名前を変更することはできません。

オブジェクトのメソッド ディクショナリは、Symbol を CompiledMethod にマップします。「メソッドの名前を変更する」とは、「CompiledMethod 値をこのキーからそのキーに移動する」ことを意味します。

于 2011-05-01T07:21:02.380 に答える