对于问题标题措辞不佳的道歉 - 不知道如何把它说得更好!
在下面的代码中,当我执行ruby bar.rb
时,如何让它输出bar.rb
,而不是foo.rb
?
在foo.rb
中:
module Foo
def filename
__FILE__
end
end
在 bar.rb
中:
require_relative 'foo'
include Foo
puts filename # outputs 'foo.rb'
这是一个库函数,每次执行一些代码时,都会记录该代码的位置(和 git ref)。
最佳答案
你的问题促使我打开 Ruby 解释器源代码,看看 __FILE__
是如何工作的。答案很有趣:它是在解析器内部实现的。词法分析器对 __FILE__
有一个特殊的标记类型。当解析器看到该标记时,它会将其转换为字符串常量,其中包含解析器正在处理的文件的名称。
来自 ext/ripper/ripper.c 的第 14948 行:
case keyword__FILE__:
return NEW_STR(rb_external_str_new_with_enc(ruby_sourcefile, strlen(ruby_sourcefile),
rb_filesystem_encoding()));
我认为这应该清楚地表明,尝试让 __FILE__
返回包含文件的名称是完全不可能的,除非你破解 Ruby 解释器源代码,或者编写自己的预处理器来转换 __FILE__
在将 Ruby 源代码传递给解释器之前传递给其他东西!
关于ruby - 从包含的文件中,如何获取执行包含的文件的文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12894796/