Como posso fazer o que eles estão falando aqui , mas em Ruby?
Como você faria a função em um objeto? e como você faria uma função global (veja a resposta do jetxee no post mencionado)?
CÓDIGO DO EXEMPLO:
event_name = "load"
def load()
puts "load() function was executed."
end
def row_changed()
puts "row_changed() function was executed."
end
#something here to see that event_name = "load" and run load()
UPDATE: Como você chega aos métodos globais? ou minhas funções globais?
Eu tentei esta linha adicional
puts methods
e load e row_change onde não estiver listado.
ruby
metaprogramming
BuddyJoe
fonte
fonte
Três maneiras:
send
/call
/eval
- e seus benchmarksChamada típica (para referência):
Usando
send
Usando
call
Usando
eval
Benchmarks
O crédito vai para este post do blog que detalha um pouco mais os três métodos e também mostra como verificar se os métodos existem.
fonte
Class.send("classVariable") = 5
? Isso gera um erro. Existe alguma maneira de contornar isso? O mesmo se aplica ao uso de #Class.method("classVariable").call() = 5
call
incluir a instanciação do método object (m.test.method(:length)
) para representar com precisão que é a hora certa? Ao usar,call
você provavelmente instancia o objeto de método sempre.Usa isto:
Simples, certo?
Quanto ao global , acho que o caminho do Ruby seria pesquisá-lo usando o
methods
métodofonte
"my_string".method('blah') #=> NameError: undefined method
blá' para a classeString'
Pessoalmente, eu configuraria um hash para funcionar referências e, em seguida, usaria a string como um índice para o hash. Você chama a referência da função com seus parâmetros. Isso tem a vantagem de não permitir que a string errada chame algo que você não deseja chamar. A outra maneira é basicamente
eval
a string. Não faça isso.O PS não seja preguiçoso e, na verdade, digite toda a sua pergunta, em vez de vincular a algo.
fonte