У меня есть класс, и я хочу изменить имя определенного метода во время выполнения. Я думаю, что есть метод в классе «Поведение», который делает это. Но я просто не могу его найти. любая помощь? [in squeak]Как изменить имя метода динамически в squeak?
ответ
Обычный способ, которым пользователь выполняет это, - изменить источник метода и «принять его», а затем удалить старую версию. Поэтому маловероятно, что базовый Squeak включает в себя единственный метод для этого, хотя я мог ошибаться.
Однако, если вы устанавливаете, например, OmniBrowser, существует метод рефакторинга, называемый «переименование», и вы можете проверить и найти код для выполнения этого рефакторинга. Это довольно сложно, во-первых, потому что рефакторинг выполняется с использованием шаблона команды, который требует небольшого перенаправления для разработки, а во-вторых, потому что это довольно сложный рефакторинг, который включает в себя изменение сайтов вызова.
Что вы предлагаете, для меня ставятся ОГРОМНЫЕ красные флаги. Что вы пытаетесь сделать с этим?
Вы хотите изменить название метода, который вы вызываете во время выполнения? Если так, это легко.
сделать что-то вроде:
|methodName|
methodName := self useMethod1 ifTrue: [#method1 ] ifFalse:[ #method2 ].
self perform: methodName.
#perform: определенно имеет свое место, но он должен обязательно поднять флаги сам по себе! –
Избегайте вуду магии в реальном коде, когда это возможно.
Это, как говорится, можно сделать очень интересные вещи, манипулируя методами динамически.
Например, кирпичи кода в 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 немного больше, чем я ,
Вы наилучшим образом использовать рефакторинга
r := RenameMethodRefactoring
renameMethod: #foo:foo:
in: Foo
to: #bar:bar:
permutation: (1 to: #foo:foo: numArgs).
r execute.
Вы не можете изменить имя метода, в самом деле, потому что он не один.
Словарь метода объекта отображает символы в CompiledMethods. «Изменить имя метода» означает «переместить значение CompiledMethod из этого ключа в этот ключ».
- 1. Как получить имя текущего метода в squeak?
- 2. Как получить подпись метода в Squeak
- 3. Как изменить имя JSONObject динамически
- 4. Как динамически определить имя метода в Ruby
- 5. Как изменить имя метода модуля magento?
- 6. Как изменить имя объекта динамически в javascript?
- 7. Как получить динамически созданное имя метода
- 8. Динамически изменить загруженное имя файла
- 9. Codeigniter Изменить имя метода URL
- 10. Как изменить имя типов ввода динамически
- 11. CodeIgniter: как изменить имя контроллера динамически
- 12. Как изменить имя кнопки бара динамически
- 13. Как изменить имя переменной массива динамически
- 14. Как изменить имя файла журнала log4j динамически
- 15. Изменить столбцы Имя динамически в SQL
- 16. изменить имя файла журнала динамически в app.config
- 17. Как изменить шрифт в окне CommandShell в pharo или squeak?
- 18. Невозможно изменить имя метода в PHPUnit
- 19. Squeak - Как переместить круг?
- 20. Как вы используете Squeak?
- 21. как изменить сигнатуру метода динамически в Java любой utiltiy
- 22. изменить имя динамически добавленного элемента выбора выбора
- 23. Как получить значение переменной класса в squeak?
- 24. Как изменить имя файла журнала динамически в log4php?
- 25. Как изменить имя приложения() -> динамически в Yii?
- 26. Как изменить имя переменной внутри цикла динамически в C#?
- 27. Как изменить имя мега-названия динамически в drupal 7.x?
- 28. Компиляция метода класса в squeak во время выполнения
- 29. новая строка в squeak
- 30. Сон в Smalltalk Squeak
Это кажется немного ... необычным. Можете ли вы описать проблему, которую вы решаете, когда считаете, что часть решения включает эту проблему? Другими словами, вы увидите шаг в стеке контекста и запустите то, что вы действительно пытаетесь сделать. –