【问题标题】:Relate a class/module name to a file without actually loading the file将类/模块名称关联到文件而不实际加载文件
【发布时间】:2018-08-23 18:39:13
【问题描述】:

我有一个测试类的名称(作为一个字符串),例如"Reports::SalesReportTest"。在不将所有测试文件加载到内存的情况下,我如何找出 Ruby 会加载 哪个文件才能让这个测试类工作?

换句话说,是否有一个函数接受类/模块名称(作为字符串),并返回需要加载以使类/模块工作的文件路径?

【问题讨论】:

标签: ruby ruby-on-rails-3


【解决方案1】:

鉴于您使用的是 rails,您可以确定文件预期的位置(或至少 rails 的位置),但这并不意味着它实际上存在。例如:

class_name = "Reports::SalesReportTest".underscore
potential_paths = ActiveSupport::Dependencies.autoload_paths.map do |path| 
   File.join(path.to_s,"#{class_name}.rb")
end

这将列出 rails 将尝试从中加载文件的所有位置。

如果您想知道该文件是否存在,那么您也可以询问 ruby​​:

class_name = "Reports::SalesReportTest".underscore
loadable_paths = ActiveSupport::Dependencies.autoload_paths.map do |path| 
   File.exist?(File.join(path.to_s,"#{class_name}.rb"))
end

【讨论】:

    【解决方案2】:

    你不能。首先,一个类定义可以跨越多个文件。其次,可以动态创建一个类,例如使用eval

    如果您知道应用程序总是以一种风格编写的,每个类都完全定义在一个且只有一个文件中,并且每个定义都遵循一定的风格规则(例如,每个 class CLASSNAME拥有)您可以读取应用程序目录中的所有文件并扫描类定义。不要忘记可能会有=begin=end 注释掉的行,您必须忽略它们。

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 2016-02-16
      • 2020-07-13
      • 2012-06-10
      • 2020-04-14
      相关资源
      最近更新 更多