【问题标题】:Shorter version of Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")]?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 中使用相对路径,因为您不知道从哪里加载。

【问题讨论】:

标签: ruby


【解决方案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 ......我认为支持旧版本的语言只会减慢语言的长期发展;)
猜你喜欢
  • 2014-06-11
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 2019-09-19
  • 2016-08-03
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
相关资源
最近更新 更多