Como posso mudar o nome de um método dinamicamente em squeak?

votos
1

Eu tenho uma classe e eu quero mudar o nome de um método específico em tempo de execução. Eu acho que há um método na classe 'Comportamento' que faz isso. Mas eu simplesmente não consigo encontrá-lo. qualquer ajuda? [Em guincho]

Publicado 19/05/2009 em 14:48
fonte usuário
Em outras línguas...                            


5 respostas

votos
2

O que você está sugerindo coloca bandeiras vermelhas enormes para mim. O que é que você está tentando conseguir com isso?

Você quer dizer que você quer mudar o nome do método que você está chamando em tempo de execução? Se assim for, isso é fácil.

fazer algo como:

|methodName|
methodName :=  self useMethod1 ifTrue: [#method1 ] ifFalse:[ #method2 ].
self perform: methodName.
Respondeu 19/05/2009 em 21:28
fonte usuário

votos
2

O caminho normal que um usuário faz isso é modificar a fonte método e 'aceito-o', em seguida, excluir a versão antiga. Portanto, não é provável que Squeak básico inclui um único método para fazer isso, embora eu poderia estar errado.

No entanto, se você instalar, por exemplo, OmniBrowser existe um método de refatoração chamada 'renomear' e você pode inspecionar e encontrar o código para executar esta refatoração. É bastante complexo, em primeiro lugar, porque as refatorações são feitas usando o padrão de comando que envolve um pouco de redirecionamento para trabalhar fora, mas em segundo lugar, porque esta é uma refatoração bastante complexo que inclui modificar os sites de chamada.

Respondeu 19/05/2009 em 18:36
fonte usuário

votos
1

Você melhor utilizar uma refatoração

r := RenameMethodRefactoring 
    renameMethod: #foo:foo: 
    in: Foo
    to: #bar:bar:
    permutation: (1 to: #foo:foo: numArgs). 
r execute.
Respondeu 20/12/2009 em 13:29
fonte usuário

votos
0

Você não pode mudar o nome de um método, realmente, porque ele não tem um.

método de dicionário de um objeto mapeia símbolos para CompiledMethods. "Alterar o nome de um método" significa "mover o valor CompiledMethod a partir desta chave para essa chave".

Respondeu 01/05/2011 em 08:21
fonte usuário

votos
0

Evite magia vudu em código real quando possível.

Dito isto você pode fazer algumas coisas muito interessantes, manipulando métodos dinamicamente.

Por exemplo, os tijolos de código em Etoys são traduzidos em métodos Smalltalk. Outros DSL implementações também podem beneficiar de truques metaprogramação semelhantes.

Depois de experimentar um pouco eu vim com o seguinte código para renomear métodos unários:

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

Você provavelmente poderia encontrar uma maneira mais fácil de fazer isso se você navegar através do código de Squeak um pouco mais do que eu fiz.

Respondeu 18/12/2009 em 07:31
fonte usuário

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