我发现传递给class_eval
的line_number,module_eval
和instance_eval
与错误报告的行号不匹配。 ruby-doc说明了这种行为:(以instance_eval
为例)
可选的第二个和第三个参数提供文件名和 报告编译错误时使用的起始行号。
所有这三种方法class_eval
,module_eval
和instance_eval
都接受另外两个参数来指定文件名和lineno参数设置错误消息的文本。
this question有一个关于此行为的实用演示。
但是,我发现行号的计算比解释更复杂。这是一个演示
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
上面的代码证明传递给line_no
的{{1}}参数不是错误报告的行号,而只与instance_eval
相关。
我想知道这个参数的确切行为吗?
答案 0 :(得分:0)
正如您的文档片段所述,lineno
指定伪文件的起始行号。您评估的字符串包含三行,其中第二行包含non_exist
(%{}
保留换行符。)
当我执行你的代码时,我在第14行收到错误,而不是你收到的错误。我本来希望得到13,但似乎红宝石解析器只会“注意到”下一行的错误,可能会寻找方法参数或其他东西来理解non_exists
(我不完全当然可以)。如果我在non_exists
之后插入另一个空行(不包含缩进),我会得到预期的13。
在%{
之后但在non_exists
之前插入的任何行都会将错误中的行号增加1,这应该是预期的。