【问题标题】:How can I dynamically include modules in nested directories?如何在嵌套目录中动态包含模块?
【发布时间】:2012-01-19 17:41:36
【问题描述】:

我想通过遍历目录结构来动态加载代码并动态加载我在那里找到的任何模块。

这样做的目的是运行一系列验证。如果顶级验证失败,则不会运行任何子验证。

我的想法是控制器对象可以扫描目录,构建模块层次结构,然后根据更高级别验证的成功/失败决定是否遍历树的特定部分。

例如,我可能想要针对正则表达式运行一系列验证,但是,如果正则表达式不存在或为空,则不应运行任何验证。在这种情况下,顶级目录将仅包含 exists 验证,如果存在正则表达式,子目录将包含要运行的所有其他验证。

能够在单独的文件中定义这些验证并创建所需的层次结构对于以后轻松添加其他验证非常有用,而不必打开现有类并添加方法。

有没有一种方法可以让应用程序动态扫描目录,将文件名保存在集合中,然后在 require 中使用该集合的元素?我不这么认为。负载呢?

有没有办法实现这样的设计?还是我认为这一切都错了,应该考虑其他方法?

【问题讨论】:

  • 我不确定您的真正目标是什么。这听起来更像是一个验证链,而不是与动态模块加载有关的任何事情;无论验证集合的成功/失败,验证方法都可以存在。

标签: ruby-on-rails ruby


【解决方案1】:

您的请求非常可行,但没有任何语言会自动为您完成。您必须编写代码以深入目录,确定测试是否存在,然后决定是否应该进一步深入。

Ruby 会帮助你。 Find 模块包含在标准库中。这是来自其文档:

Find 模块支持对一组文件路径进行自上而下的遍历。 例如,要计算主目录下所有文件的大小, 忽略“点”目录中的任何内容(例如 $HOME/.ssh): 需要'查找' 总大小 = 0 Find.find(ENV["HOME"]) 做 |路径| 如果 FileTest.directory?(路径) 如果 File.basename(path)[0] == ?. Find.prune # 不要再看这个目录了。 别的 下一个 结尾 别的 total_size += FileTest.size(路径) 结尾 结尾

您可以从该代码中查找文件和嵌入文件夹的签名,以决定是否应该进一步深入研究。对于找到的每个您想要的文件,使用require 加载它。

您可以在“互联网”上找到其他示例,展示人们如何使用Find。此外,Dir 模块使用 glob 具有类似的功能,只是您必须告诉它从哪里下降,然后可以迭代返回的结果。

【讨论】:

  • 找到目录和文件列表后,您可以遍历它们以根据您要检查的任何条件要求该文件名。
  • @roberocity,是的。我正要添加它,但被召集参加会议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 2020-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2019-01-19
  • 2011-12-29
相关资源
最近更新 更多