Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")] 的较短版本?
Posted
技术标签:
【中文标题】Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")] 的较短版本?【英文标题】:Shorter version of 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 中使用相对路径,因为您不知道从哪里加载。
【问题讨论】:
插入目录名而不是调用File.join
嘿,我想这行得通 :) File.join 为 Windows 做了一些事情,但考虑到 ruby 无论如何都会使用 /
加载文件,这并不重要。
另见***.com/questions/788550/…和***.com/questions/735073/…
【参考方案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 ......我认为支持旧版本的语言只会减慢语言的长期发展;)以上是关于Dir[File.join(File.dirname(__FILE__), "subdirectory/**/*.rb")] 的较短版本?的主要内容,如果未能解决你的问题,请参考以下文章