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

时间:2011-10-22 03:37:33

标签: ruby

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

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

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

1 个答案:

答案 0 :(得分:1)

你使用哪种rube?使用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构建Path,因此操作系统可以使用它。在unix中,路径分隔符为/,位于窗口\中。但正如你已经写过的那样:ruby理解/,所以在windows中无所谓。但是如果您使用Classic Mac OS会发生什么?它是:(见Wikipedia Path_(computing))。所以最好使用join,(或者你使用我的Dir.chdir变体)

相关问题