Либо вы можете получить обратную трассировку, как предложено логаном, либо вы можете запустить свой компилятор C и взломать исходный код для ruby. Я достаточно уверен, что нет других способов сделать это.

ел бы сделать некоторые довольно тяжелые отражения в 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 будет работать наиболее легко. Я не думаю, что Caller + ParseTree было бы достаточно сами по себе.

Что касается того, почему я хотел бы сделать это, то вместо того, чтобы говорить «автоматическая отладка», возможно, я должен сказать, что я хотел бы использовать эту функциональность для автоматической проверки условий вызова и возврата функций:

def add x, y 
  check_positive
  return x + y
end

гдеcheck_positive бросил бы исключение, еслиx а такжеy не были положительными. Очевидно, что это было бы больше, чем это, но, надеюсь, это дает достаточно мотивации.

Ответы на вопрос(5)

Ваш ответ на вопрос