Me gustaría hacer un poco de reflexión bastante resistente en Ruby. Quiero crear una función que devuelva los nombres de los argumentos de varias funciones de llamada más arriba en la pila de llamadas (solo una más sería suficiente, pero ¿por qué detenerse ahí?). Podría usar Kernel.caller
, ir al archivo y analizar la lista de argumentos, pero sería feo y poco confiable.Cómo obtener nombres de argumento usando la reflexión
La función que me gustaría que funcionaría de la siguiente manera:
module A
def method1(tuti, fruity)
foo
end
def method2(bim, bam, boom)
foo
end
def foo
print caller_args[1].join(",") #the "1" mean one step up the call stack
end
end
A.method1
#prints "tuti,fruity"
A.method2
#prints "bim, bam, boom"
no me importaría usar ParseTree o alguna herramienta similar para esta tarea, pero mirando al árbol de traducción, no resulta evidente cómo usarlo para este propósito. Crear una extensión C como this es otra posibilidad, pero sería bueno si alguien ya lo hubiera hecho por mí.
Veo que probablemente necesite algún tipo de extensión C. Supongo que eso significa que mi pregunta es qué combinación de extensión C funcionaría más fácilmente. No creo que el llamador + ParseTree sea suficiente por sí mismos.
En cuanto a por qué me gustaría hacer esto, en lugar de decir "depuración automática", quizás debería decir que me gustaría utilizar esta funcionalidad para hacer una comprobación automática de las condiciones de llamada y devolución de funciones:
def add x, y
check_positive
return x + y
end
Dónde check_positive
lanzaría una excepción si x
y y
no fueron positivos. Obviamente, habría más que eso, pero espero que esto proporcione suficiente motivación.
Parece que desea determinar el orden de ejecución y los argumentos. ¿Hay alguna razón por la que no puedas usar el registro? Probablemente puedas incluso hacer metaprogramación para abrir todos los métodos en la clase y automáticamente registrar los argumentos para hacer lo que quieras. – runako