3

我发现传递给 的 line_numberclass_evalmodule_eval错误instance_eval报告的行号不匹配。ruby-doc没有解释这种行为, 它说:(instance_eval用作示例)

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

所有这三个方法class_evalmodule_evalinstance_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

上面的代码证明line_no传递给的参数instance_eval不是报错的行号,而只是与line_no.

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

4

1 回答 1

1

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

当我执行您的代码时,我在第 14 行收到错误,而不是您收到的第 15 行。我原本预计会得到 13,但似乎 ruby​​ 解析器只会“注意到”下一行的错误,可能会寻找方法参数或其他有意义的东西non_exists(我对此并不完全确定)。如果我在 之后插入另一个空行(不包含缩进)non_exists,我会得到预期的 13。

%{正如预期的那样,在之前但之后插入的任何行non_exists都会将错误中的行号加一。

于 2013-09-16T14:41:52.173 回答