ruby:instance_eval一个文件,同时在stacktrace中维护文件:line?

Itt*_*ayD 12 ruby

如果我做

def eval_file(file)
  instance_eval read(file)
end
Run Code Online (Sandbox Code Playgroud)

然后,一旦在文件中的一个方法/块中发生了某些事情,我看到的就是(eval):20 in 'eval_file'.当我使用带有许多文件的eval_file时,很难判断异常来自哪一个(eval之后发生异常,使用方法时)

有什么方法可以让我看到实际的文件和行号吗?

Jör*_*tag 19

正如你可以看到从文档,BasicObject#instance_eval(实际上所有其他*_evalS以及)将简单地报告任何文件名和行号,你告诉它:

方法:BasicObject #instance_eval

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

在接收器(obj)的上下文中计算包含Ruby源代码或给定块的字符串.为了设置上下文,在代码执行时将变量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
Run Code Online (Sandbox Code Playgroud)