Como obter nomes de argumentos usando reflexão
Gostaria de fazer uma reflexão bastante pesada em Ruby. Eu quero criar uma função que retorne os nomes dos argumentos de várias funções de chamada mais altas na pilha de chamadas (apenas uma maior seria suficiente, mas por que parar aí?). Eu poderia usarKernel.caller
, vá para o arquivo e analise a lista de argumentos, mas isso seria feio e não confiáve
A função que eu gostaria funcionaria da seguinte maneira:
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"
Eu não me importaria de usar ParseTree ou alguma ferramenta semelhante para esta tarefa, mas olhando para o Parsetree, não é óbvio como usá-lo para esse fim. Criando uma extensão C comoist é outra possibilidade, mas seria bom se alguém já tivesse feito isso por mim.
Posso ver que provavelmente vou precisar de algum tipo de extensão C. Suponho que isso signifique que minha pergunta é qual combinação de extensão C funcionaria mais facilmente. Eu não acho que o chamador + ParseTree seria suficiente por si só.
Na medida em que eu gostaria de fazer isso, em vez de dizer "depuração automática", talvez eu devesse dizer que gostaria de usar essa funcionalidade para verificar automaticamente as condições de chamada e retorno das funções:
def add x, y
check_positive
return x + y
end
Ondecheck_positive
lançaria uma exceção sex
ey
não foram positivos. Obviamente, haveria mais do que isso, mas espero que isso dê motivação suficiente.