ruby: instance_eval файл при сохранении file: строка в stacktrace?

#ruby

#ruby

Вопрос:

Если я сделаю

 def eval_file(file)
  instance_eval read(file)
end
  

Затем, как только что-то происходит в одном из методов / блоков внутри файла, все, что я вижу, это что-то вроде (eval):20 in 'eval_file ‘. Когда я использую eval_file со многими файлами, трудно сказать, из какого из них возникло исключение (исключение происходит после eval, при использовании метода)

Есть ли какой-нибудь способ для меня увидеть фактический номер файла и строки?

Ответ №1:

Как вы можете видеть из документации, BasicObject#instance_eval (и фактически все остальные *_eval файлы также) просто сообщат любое имя файла и номер строки, которые вы ему укажете:

Метод: BasicObject#instance_eval

  • ( Object ) instance_eval(string[, filename [, lineno]])

Вычисляет строку, содержащую исходный код Ruby, или данный блок, в контексте получателя (obj). Чтобы задать контекст, переменной self во время выполнения кода присваивается значение obj, что предоставляет коду доступ к переменным экземпляра obj. В версии, instance_eval которая принимает String , необязательные второй и третий параметры предоставляют имя файла и номер начальной строки, которые используются при сообщении об ошибках компиляции.

[…]

Перегружает:

  • ( Object ) instance_eval(string[, filename [, lineno]])

[Выделено мной.]

В общем, если вы используете String перегрузку *_eval методов, вы должны убедиться, что получаете разумную информацию о местоположении, передавая имя файла и номер строки [альтернативная ссылка].

В вашем конкретном случае вам следует опустить номер строки, поскольку вы хотите, чтобы Ruby просто использовал номера строк файла, но вам нужно передать имя файла:

 def eval_file(file)
  instance_eval read(file), file
end