更短版本的Dir [File.join(File.dirname(__ FILE__),"子目录/**/*.rb")]?

d11*_*wtq 6 ruby

这是一个微观问题,但每次我创建一个gem并需要加载一个子目录下的所有文件以达到某种反射目的(或者只是一个快速和脏的预加载),我问自己"肯定在那里必须是一个更清洁的方式?",参考这种常见的模式:

Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")].each { |f| require f }
Run Code Online (Sandbox Code Playgroud)

需要调用File.dirname__FILE__,使得它不必要的冗长.你不能在gem中使用相对路径,因为你不知道从哪里加载.

knu*_*nut 1

你用哪种鲁布?在 ruby​​ 1.9 中,您可以使用require_relative.

require_relative 'subdirectory/file1.rb'
require_relative 'subdirectory/file2.rb'
#...
Run Code Online (Sandbox Code Playgroud)

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

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

Dir.chdir(File.dirname(__FILE__)){
  Dir["**/*.rb"].each { |f| 
    require_relative f
  }
}
Run Code Online (Sandbox Code Playgroud)

对于 ruby​​ 1.8,这应该可以工作:

Dir.chdir(File.dirname(__FILE__)){
  Dir["./**/*.rb"].each { |f| 
    require f
  }
}
Run Code Online (Sandbox Code Playgroud)

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