Как изменить имя метода, динамически писк?

голоса
1

У меня есть класс, и я хочу, чтобы изменить имя конкретного метода в время выполнения. Я предполагаю, что есть метод в классе «поведение», что делает это. Но я просто не могу найти его. любая помощь? [В писке]

Задан 19/05/2009 в 12:48
источник пользователем
На других языках...                            


5 ответов

голоса
2

Обычный способ пользователь делает это, чтобы изменить источник метода и «принять его», затем удалите старую версию. Так что это не вероятно, что основной Писк включает в себя единственный способ сделать это, хотя я могу ошибаться.

Однако, если вы установите, например, OmniBrowser есть метод рефакторинг под названием «переименования», и вы можете проверить и найти код для выполнения этого рефакторинга. Это довольно сложный комплекс, во-первых, потому, что рефакторинг выполняются с помощью шаблона команды, которая включает в себя немного переназначение работать, но, во-вторых, потому что это довольно сложный рефакторинг, который включает в себя изменение места вызова.

Ответил 19/05/2009 в 16:36
источник пользователем

голоса
2

То, что вы предлагаете высвечивает чудовищные красные флаги для меня. Что вы пытаетесь сделать с этим?

Значит, вы хотите изменить имя метода, которому вы звоните во время выполнения? Если это так, что это легко.

сделать что-то вроде:

|methodName|
methodName :=  self useMethod1 ifTrue: [#method1 ] ifFalse:[ #method2 ].
self perform: methodName.
Ответил 19/05/2009 в 19:28
источник пользователем

голоса
0

Избегайте вуду магии в реальном коде, когда это возможно.

Это, как сказал, что вы можете сделать некоторые очень интересные вещи динамически манипулировать методами.

Например кодовые кирпичи в еТоузе переводятся в 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 немного больше, чем я.

Ответил 18/12/2009 в 05:31
источник пользователем

голоса
1

Вы лучше использовать рефакторинг

r := RenameMethodRefactoring 
    renameMethod: #foo:foo: 
    in: Foo
    to: #bar:bar:
    permutation: (1 to: #foo:foo: numArgs). 
r execute.
Ответил 20/12/2009 в 11:29
источник пользователем

голоса
0

Вы не можете изменить имя метода, в самом деле, потому что он не один.

Словарь метод объекта отображает символы в CompiledMethods. «Изменить имя методы» означает «переместить значение Скомпилированного из этого ключа к этому ключу».

Ответил 01/05/2011 в 06:21
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more