Я хотел бы сделать довольно серьезное отражение в Ruby. Я хочу создать функцию, которая возвращает имена аргументов различных вызывающих функций выше стека вызовов (достаточно одного уровня, но зачем останавливаться на нем?). Я мог бы использовать Kernel.caller
, перейти к файлу и проанализировать список аргументов, но это было бы уродливо и ненадежно.
Функция, которую я хотел бы, будет работать следующим образом:
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"
Я бы не прочь использовать ParseTree или какой-то подобный инструмент для этой задачи, но, глядя на Parsetree, неясно, как использовать это для этой цели. Создание расширения C, например это, является другой возможностью, но было бы неплохо, если бы кто-то уже сделал это для меня.
Я вижу, что мне, вероятно, понадобится какое-то расширение C. Полагаю, это означает, что мой вопрос заключается в том, какая комбинация расширения C будет работать наиболее легко. Я не думаю, что Caller + ParseTree будет достаточно.
Насколько я хотел бы это сделать, вместо того, чтобы говорить "автоматическая отладка", возможно, я должен сказать, что я хотел бы использовать эту функцию для автоматической проверки условий вызова и возврата функций:
def add x, y
check_positive
return x + y
end
Где check_positive
генерирует исключение, если x
и y
не были положительными. Очевидно, что было бы больше, чем это, но, надеюсь, это дает достаточную мотивацию.