Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中的递归目录搜索_Ruby On Rails_Ruby_Recursion - Fatal编程技术网

Ruby on rails Rails中的递归目录搜索

Ruby on rails Rails中的递归目录搜索,ruby-on-rails,ruby,recursion,Ruby On Rails,Ruby,Recursion,因此,我这里有一个函数,它应该以archive.zip的路径作为参数,递归地深入到每个子目录,直到找到一个扩展名为.html的文件 def path_to_project "#{recursive_find(File.dirname(self.folder.path))}" end path_to_项目用于将这个递归的_find进程作为字符串动态应用,因为它作为一个整体在进程中重复使用 def recursive_find(proj_path) Dir.glob("#{proj

因此,我这里有一个函数,它应该以archive.zip的路径作为参数,递归地深入到每个子目录,直到找到一个扩展名为.html的文件

def path_to_project
    "#{recursive_find(File.dirname(self.folder.path))}"
end
path_to_项目用于将这个递归的_find进程作为字符串动态应用,因为它作为一个整体在进程中重复使用

def recursive_find(proj_path)
    Dir.glob("#{proj_path}/*") do |object_path|
        if object_path.split(".").last == "html"
            @found_it = File.dirname(object_path)
        else
            recursive_find(object_path)
        end
    end
    @found_it
end
不管怎么说,我有两个问题要问stackoverflow的聪明人-

1-我使用@found\u it实例变量是否正确,也许我应该使用attr\u访问器:find\u it?很明显,他还提到了一些不愚蠢的东西。。也许:html_文件

或许-

    unless @found_it
    # do the whole recursive thing
    end
    return @found_it 
    # I don't actually have to return the variable right?

2-我的递归方法能更好吗?我意识到这是非常开放的,所以无论如何,把你们这些愤怒的居民赶走。我很高兴接受你的严厉批评,并衷心感谢你的好建议:)

如果你不需要使用递归,你可以这样做

Dir[“#{proj\u path}”/**/*.html”
它将为您提供扩展名为
html
的所有文件的列表

至于你的问题:你对
@found\u it
的使用取决于更大的范围。这个函数在哪里定义了一个类或模块?变量本身的名称可能更有意义,比如
@html\u file
,或者文件的上下文是什么样的
@result\u page
Ruby的类是一个非常简单的问题o使用、可扩展的解决方案。它下降到一个目录层次结构中,返回遇到的每个元素。您可以告诉它递归到特定目录中,忽略基于属性的文件和目录,而且速度非常快

这是文档中的示例:

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 需要“查找” 总尺寸=0 Find.Find(ENV[“HOME”])do | path| if FileTest.directory?(路径) 如果File.basename(路径)[0]==?。 Find.prune#不要进一步查看此目录。 其他的 下一个 结束 其他的 总大小+=FileTest.size(路径) 结束 结束
我使用它对包含数千个文件的目录进行多次扫描。这与使用glob一样简单。

由于递归调用没有基本情况,您可能会进入无限循环,如果没有与“html”匹配的文件,您需要使用递归吗?您不能执行类似于
Dir[“{proj_path}/***.html”的操作吗
这将再次为您提供所有具有html扩展功能的文件,答案比我想象的要简单得多。--对于第2部分,此实例变量在类中定义。实例变量的访问器将很好,这取决于您对方法的看法。如果是查询类型的方法,我希望它返回结果,如果是一个命令类型的方法,我希望它能改变类的状态,但不能同时改变两者。