2

我发现传递给class_eval,module_evalinstance_eval的line_number与错误报告的行号不匹配。module_eval/class_eval/instance_eval如何计算行号

任选的第二和第三个参数提供该所报告编译错误时所使用的文件名和 起始行号(使用instance_eval作为例子):此行为不是由ruby-doc它说说明。

所有这三种方法class_evalmodule_evalinstance_eval接受两个额外的PARAMS指定文件名和参数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 PARAM传递给instance_eval不被错误报告的行号,但只与line_no

我想知道这个参数的确切行为?

回答

0

作为文档状态的片段,lineno指定起始伪文件的行号。您评估的字符串包含三行,其中第二行包含non_exist%{}保留换行符)。

当我执行你的代码时,我在第14行中得到一个错误,而不是你收到的15。我本来希望得到13,但似乎ruby解析器只会“注意到”下一行的错误,可能寻找方法参数或其他方法来解释non_exists(我并不完全确定) 。如果我non_exists后插入另一张空白行(包含无压痕),我得到预期的13

%{后插入的任何行,但non_exists之前将由一个递增错误的行号,应该可以预期的。