这是一个微观问题,但每次我创建一个gem并需要加载一个子目录下的所有文件以达到某种反射目的(或者只是快速而脏的预加载),我会问自己“当然必须采用更清洁的方式?”,参考这种常见模式:
Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")].each { |f| require f }
需要在File.dirname
上调用__FILE__
,这会使其不必要地冗长。你不能真正使用gem中的相对路径,因为你不知道你从哪里加载。
答案 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变体)