¿Cómo puedo hacer de lo que están hablando aquí , pero en Ruby?
¿Cómo harías la función en un objeto? y ¿cómo haría una función global (vea la respuesta de jetxee en la publicación mencionada)?
CÓDIGO DE EJEMPLO:
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()
ACTUALIZACIÓN: ¿Cómo se llega a los métodos globales? o mis funciones globales?
Probé esta línea adicional
puts methods
y cargar y remar_cambiar donde no figura.
ruby
metaprogramming
BuddyJoe
fuente
fuente
Tres formas:
send
/call
/eval
- y sus puntos de referenciaInvocación típica (para referencia):
Utilizando
send
Utilizando
call
Utilizando
eval
Puntos de referencia
El crédito va a esta publicación de blog que elabora un poco más sobre los tres métodos y también muestra cómo verificar si los métodos existen.
fuente
Class.send("classVariable") = 5
? Eso arroja un error. ¿Hay alguna forma de evitar eso? Lo mismo es cierto para usarClass.method("classVariable").call() = 5
call
incluir la creación de instancias del método object (m.test.method(:length)
) para representar con precisión su tiempo real? Cuando lo usecall
, probablemente creará una instancia del objeto del método cada vez.Utilizar este:
Simple, ¿verdad?
En cuanto a lo global , creo que la forma de Ruby sería buscarlo usando el
methods
método.fuente
"my_string".method('blah') #=> NameError: undefined method
bla 'para la claseString'
Personalmente, configuraría un hash para que funcionen las referencias y luego usaría la cadena como un índice para el hash. Luego llama a la referencia de función con sus parámetros. Esto tiene la ventaja de no permitir que la cadena incorrecta llame a algo que no desea llamar. La otra forma es básicamente
eval
la cadena. No hagas esto.PD: no seas perezoso y escribe toda tu pregunta, en lugar de vincularte a algo.
fuente