在ruby中从一个目录中获取所有文件的最好方法是什么?
当前回答
还有:require_relative *Dir['相对路径']呢?
其他回答
Dir[File.dirname(__FILE__) + '/../lib/*.rb'].each do |file|
require File.basename(file, File.extname(file))
end
如果您不剥离扩展名,那么您可能会需要相同的文件两次(ruby不会意识到“foo”和“foo. exe”。Rb”是相同的文件)。两次要求相同的文件可能会导致错误的警告(例如。"警告:已初始化的常量")。
还有:require_relative *Dir['相对路径']呢?
最好的方法是将目录添加到加载路径,然后要求每个文件的基名。这是因为您希望避免意外地两次需要相同的文件——这通常不是预期的行为。一个文件是否会被加载取决于require之前是否看到过传递给它的路径。例如,这个简单的irb会话表明,您可能会错误地要求并加载同一个文件两次。
$ irb
irb(main):001:0> require 'test'
=> true
irb(main):002:0> require './test'
=> true
irb(main):003:0> require './test.rb'
=> false
irb(main):004:0> require 'test'
=> false
请注意,前两行返回true,这意味着两次都加载了相同的文件。当使用路径时,即使路径指向相同的位置,require也不知道该文件已经被需要了。
在这里,我们将一个目录添加到加载路径中,然后要求每个*的基名。Rb文件。
dir = "/path/to/directory"
$LOAD_PATH.unshift(dir)
Dir[File.join(dir, "*.rb")].each {|file| require File.basename(file) }
如果您不关心文件是否被多次要求,或者您的目的只是加载文件的内容,那么也许应该使用load而不是require。在本例中使用load,因为它能更好地表达您要完成的任务。例如:
Dir["/path/to/directory/*.rb"].each {|file| load file }
我已经晚了几年,但我有点喜欢这个单行解决方案,我用来让rails包括app/workers/concerns中的所有内容:
目录[Rails.root.join *%w(应用程序worker关注点*)]。每个{|f| require f}
Dir[File.join(__dir__, "/app/**/*.rb")].each do |file|
require file
end
这将在您的本地机器和不使用相对路径的远程(如Heroku)上递归地工作。
推荐文章
- 如何找到包含匹配值的哈希键
- 如何在Rails中找到当前的路由?
- 将列表的Python列表写入csv文件
- 在Ruby中->运算符叫什么?
- Rails参数解释?
- Ruby中DateTime和Time的区别
- 如何从代理服务器后面更新Ruby Gems (ISA-NTLM)
- 如何用另一个键替换哈希键
- 如何使用Bash创建一个文件夹,如果它还不存在?
- attr_accessor和attr_accessible的区别
- 如何从Ruby文件路径中获得没有扩展名的文件名
- rvm安装失败:“rvm不是一个函数”
- 学习Ruby on Rails
- 不能与文件列表一起使用forEach
- Ruby中的数组切片:解释不合逻辑的行为(摘自Rubykoans.com)