module_eval / class_eval / instance_eval如何计算行号

时间:2013-05-18 17:46:58

标签: ruby error-handling metaprogramming class-eval instance-eval

我发现传递给class_eval的line_number,module_evalinstance_eval与错误报告的行号不匹配。 ruby-doc说明了这种行为:(以instance_eval为例)

  

可选的第二个和第三个参数提供文件名和   报告编译错误时使用的起始行号。

所有这三种方法class_evalmodule_evalinstance_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相关。

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

1 个答案:

答案 0 :(得分:0)

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

当我执行你的代码时,我在第14行收到错误,而不是你收到的错误。我本来希望得到13,但似乎红宝石解析器只会“注意到”下一行的错误,可能会寻找方法参数或其他东西来理解non_exists(我不完全当然可以)。如果我在non_exists之后插入另一个空行(不包含缩进),我会得到预期的13。

%{之后但在non_exists之前插入的任何行都会将错误中的行号增加1,这应该是预期的。