看起来,在执行过程中,__FILE__
和__LINE__
常量会动态更新为当前文件和行号。我想知道这种行为在Ruby中是如何实现的?
我已经搜索了源代码,但出现了太多关于__LINE__
和__FILE__
的噪声,我想知道是否有人能帮我指向源代码,并提供理解其行为的线索。
在Rubinis
或MRI
中解释都可以。
看起来,在执行过程中,__FILE__
和__LINE__
常量会动态更新为当前文件和行号。我想知道这种行为在Ruby中是如何实现的?
我已经搜索了源代码,但出现了太多关于__LINE__
和__FILE__
的噪声,我想知道是否有人能帮我指向源代码,并提供理解其行为的线索。
在Rubinis
或MRI
中解释都可以。
__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__
,这并不总是按您所期望的方式。__FILE__
和__LINE__
都是从静态函数gettable_gen
中调用的。这是否意味着每次从Ruby调用__LINE__
时,都会调用NEW_STR()
来生成动态值? - steveyang__LINE__
的“调用”了。从那时起,它们都是常量。这就像在运行程序之前,你把你的Ruby文件交给一个朋友,让他手动替换每个__FILE__
出现的位置为文件名,每个__LINE__
出现的位置为行号,然后你加载该文件到Ruby中一样。 - hammar__LINE__
作为一个常量在程序执行时会被更新。这个变量不应该指向一个固定的内存空间。我的第一次理解是每次解析__LINE__
时都会调用NEW_LIT
。 - steveyang__LINE__
的出现(无论是在第二行、第三行等)一次性替换为该表达式所在的行数吗? - steveyang
__LINE__
,但是噪音太多,很难准确地定位到代码。如果你能帮忙,我将非常感激! - steveyang