簡體   English   中英

module_eval / class_eval / instance_eval如何計算行號

[英]How does module_eval / class_eval / instance_eval counts the line numbers

我發現傳遞給class_eval的line_number, module_evalinstance_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

上面的代碼證明傳遞給instance_evalline_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM