[英]How does module_eval / class_eval / instance_eval counts the line numbers
我發現傳遞給class_eval
的line_number, module_eval
和instance_eval
與錯誤報告的行號不匹配。 ruby-doc沒有解釋此行為,它說:(以instance_eval
為例)
可選的第二和第三個參數提供了在報告編譯錯誤時使用的文件名和起始行號。
這三個方法class_eval
, module_eval
和instance_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_eval
的line_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.