如何在嵌套目录中动态包含模块?

时间:2012-01-19 17:41:36

标签: ruby-on-rails ruby

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

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

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

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

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

应用程序是否可以动态扫描目录,将文件名保存在集合中,然后在require中使用该集合的元素?我不这么认为。负载怎么样?

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

1 个答案:

答案 0 :(得分:1)

您的请求非常可行,但没有语言会自动为您执行此操作。您必须编写代码以深入到目录中,确定是否存在测试,然后决定是否应该进一步向下钻取。

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

The Find module supports the top-down traversal of a set of file paths.

For example, to total the size of all files under your home directory,
ignoring anything in a "dot" directory (e.g. $HOME/.ssh):

      require 'find'

      total_size = 0

      Find.find(ENV["HOME"]) do |path|
        if FileTest.directory?(path)
          if File.basename(path)[0] == ?.
            Find.prune       # Don't look any further into this directory.
          else
            next
          end
        else
          total_size += FileTest.size(path)
        end
      end

从该代码中,您可以查找文件和嵌入文件夹的签名,以确定是否应该进一步向下钻取。对于找到的每个文件,使用require加载它。

您可以在"互联网"上找到其他示例。显示人们如何使用Find。此外,Dir模块使用glob具有类似的功能,只需要告诉它下降的位置,然后可以迭代返回的结果。

相关问题