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之前將由一個遞增錯誤的行號,應該可以預期的。