ruby - 从包含的文件中,如何获取执行包含的文件的文件名?

标签 ruby

对于问题标题措辞不佳的道歉 - 不知道如何把它说得更好!

在下面的代码中,当我执行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/

相关文章:

mysql - 这个 SQL 语法正确吗?

Ruby:Proc#call 与 yield

ruby-on-rails - 更新方法的参数数量错误(1 对 2)

ruby-on-rails - 使用类常量作为 Ruby 哈希键

ruby-on-rails - 将基于 thor 的实用程序 CLI 的 binstub 添加到 Rails 应用程序的最佳方法

ruby-on-rails - 在 ruby​​ on rails 中使用 facebook graph api 时从 url 获取一个 json 对象

ruby - 使用 pem 证书解码 ruby​​/jwt

ruby - 延迟作业每次引发错误时都会创建空气制动器

ruby-on-rails - 如何在不提示输入密码的情况下部署 Capistrano?

ruby - 如何使用 Shopify API 根据 SKU 搜索产品?