[英]How does module_eval / class_eval / instance_eval counts the line numbers
我发现传递给class_eval
的line_number, module_eval
和instance_eval
与错误报告的行号不匹配。 ruby-doc没有解释此行为,它说:(以instance_eval
为例)
可选的第二和第三个参数提供了在报告编译错误时使用的文件名和起始行号。
这三个方法class_eval
, module_eval
和instance_eval
接受两个附加参数来指定文件名和lineno参数,以设置错误消息的文本。
这个问题对此行为有一个实际的演示。
但是,我发现行号的计算比解释要复杂。 这是一个演示
class Thing
def add_method
a = %{
non_exist
}
instance_eval(a, 'dummy', 12)
end
end
# error will raise to 15 instead of 12 which is specified
puts Thing.new.add_method
上面的代码证明传递给instance_eval
的line_no
参数不是错误报告的行号,而仅与line_no
。
我想知道这些参数的确切行为吗?
如文档片段所述, lineno
指定伪文件的起始行号。 您评估的字符串包含三行,第二行包含non_exist
( %{}
保留换行符)。
当我执行代码时,在第14行出现错误,而不是收到的15。 我原本希望得到13,但似乎ruby解析器只会“注意”下一行的错误,可能正在寻找方法参数或其他有意义的non_exists
(我不太确定) 。 如果我在non_exists
之后插入另一个空行(不包含缩进), non_exists
得到预期的13。
可以预期,在%{
但在non_exists
之前插入的任何non_exists
会使错误中的行号增加1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.