#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