Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")] 的较短版本?

Posted

技术标签:

【中文标题】Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")] 的较短版本?【英文标题】:Shorter version of Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")]? 【发布时间】:2011-12-13 00:31:31 【问题描述】:

这是一个小问题,但每次我创建一个 gem 并且需要加载子目录下的所有文件以实现某种反思目的(或只是快速而肮脏的预加载)时,我都会问自己“肯定有一种更清洁的方式吗?”,参考这种常见的模式:

Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")].each  |f| require f 

需要在__FILE__ 上调用File.dirname,这使得它不必要地冗长。您不能真正在 gem 中使用相对路径,因为您不知道从哪里加载。

【问题讨论】:

插入目录名而不是调用File.join 嘿,我想这行得通 :) File.join 为 Windows 做了一些事情,但考虑到 ruby​​ 无论如何都会使用 / 加载文件,这并不重要。 另见***.com/questions/788550/…和***.com/questions/735073/… 【参考方案1】:

你用的是哪一种?使用 ruby​​ 1.9,您可以使用 require_relative

require_relative 'subdirectory/file1.rb'
require_relative 'subdirectory/file2.rb'
#...

但是你必须知道这些文件。 require_relative 不适用于子目录中的所有文件。但我不建议在 gem 中使用这样的通用读取。你应该知道你加载了什么。

如果你真的想要它,你可以使用这样的东西:

Dir.chdir(File.dirname(__FILE__))
  Dir["**/*.rb"].each  |f| 
    require_relative f
  

使用 ruby​​ 1.8 这应该可以工作:

Dir.chdir(File.dirname(__FILE__))
  Dir["./**/*.rb"].each  |f| 
    require f
  


关于 File.join 为 Windows 做了一些事情:File.join 构建路径,因此操作系统可以使用它。在 unix 中,路径分隔符为 /,在 Windows 中为 \。但正如你已经写的:ruby 理解/,所以在 Windows 中没关系。但是,如果您使用 Classic Mac OS 会发生什么?那里有一个:(见Wikipedia Path_(computing))。所以最好使用 join,(或者你使用我的 Dir.chdir 变体)

【讨论】:

很好的答案。我不知道require_relative,谢谢!我正在使用 ruby​​ 1.9 和 tbh,不关心在我编写的 gems 中支持 1.8 ......我认为支持旧版本的语言只会减慢语言的长期发展;)

以上是关于Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")] 的较短版本?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby:无法加载此类文件 - LoadError

动态包含目录中的所有模块

Ruby:目录类方法

递归获取目录大小

查找子目录

指定深度的子目录