问题 如何在Ruby中实现__LINE__和__FILE__常量?


好像是 __FILE__ 和 __LINE__ 使用正在执行的当前文件和行号动态更新常量,我想知道如何在Ruby中实现该行为?

我已经对源代码进行了比较,但是噪音太多了 __LINE__ 和 __FILE__ 外观,我很奇怪任何人都可以帮助我指出源代码并提供了解其行为的线索。

两种解释 Rubinis 要么 MRI 会没事的。


12443
2018-05-18 17:19


起源

也许看看来源? - Cody Caughlan
为什么选择downvote?对我来说似乎是个好问题。 - Sergio Tulentsev
@CodyCaughlan:你能指出相关的文件/行吗?我好奇自己:) - Sergio Tulentsev
@CodyCaughlan你可以帮助指向文件:源代码中的行。我贪图 __LINE__ 但是在确切的代码上噪音太大而且很难归零。如果你能提供帮助,我将非常感激! - steveyang


答案:


__FILE__ 和 __LINE__ 被文字取代 直接在解析器中

case keyword__FILE__:
    return NEW_STR(rb_external_str_new_with_enc(ruby_sourcefile, strlen(ruby_sourcefile),
                                                rb_filesystem_encoding()));
case keyword__LINE__:
    return NEW_LIT(INT2FIX(tokline));

换句话说,它们的行为就像您自己输入结果字符串或数字一样。

请注意 __LINE__, 这个 并不总是表现出你的期望


12
2018-05-18 17:41



感谢博客链接:) - Arup Rakshit
@hammar感谢您的源代码。我不熟悉解析器 __FILE__ 和 __LINE__ 从静态函数调用 gettable_gen。这是不是意味着 每次  __LINE__ 被称为红宝石, NEW_STR() 被调用来生成动态值? - steveyang
@ steven.yang:不,解析只在加载文件时发生一次。没有“打电话” __LINE__ 之后。从那时起,这一切都只是常数。就像在你运行你的程序之前,你把你的ruby文件给了一个经过它的朋友并手动替换每次出现的 __FILE__ 用文件名和每次出现 __LINE__ 使用行号,然后将该文件加载到ruby中。 - hammar
@hammar然后,为什么 __LINE__,**作为常量**在程序执行时更新。此变量不得指向一个固定的内存空间。我的第一个理解是 NEW_LIT 每次都要调用 __LINE__。 - steveyang
@ steven.yang:我不知道你从哪里得到这个想法。不是。加载文件时,如果有 __LINE__ 在第2行,它被a替换 2。没有变数。无需更新。 - hammar