0

我正在学习 Ruby,但我在整个隐式返回值方面遇到了麻烦。有人请告诉我为什么这会返回一个空向量:

  3 def get_filenames(path)
  4   filenames = []
  5 
  6   if (path == ".") || (path == "..")
  7     []
  8   elsif File.directory? path
  9     Dir.entries(path).each do |sub_path|
 10       filenames += get_filenames(sub_path)
 11     end
 12   else #presumably it's a file
 13     [File.basename(path,".*")]
 14   end
 15 end

它应该返回从参数路径递归搜索时找到的所有文件名(无扩展名)的数组。

假设我用“/tmp”调用函数,tmp 包含 2 个文件:“A.txt”和“Bm”,然后是一个包含 1 个文件“C.exe”的目录。我希望这个函数返回 ["A","B","C"]

4

5 回答 5

2

首先,Dir.entries不会获得绝对路径,因此当您尝试调用时,您get_filenames(sub_path)会调用相对文件名路径(并且您的函数会收到绝对路径)

用这个:

def get_files(dir)
   files = []
   Find.find(dir) { |path| files << File.basename(path,".*") if FileTest.file?(path) }
   return files
end
于 2011-01-17T16:40:43.970 回答
1

这是您查询的简单解决方案...查找当前目录和子目录中存在的每个文件

{Find.find("", "#{path}") do |file|
 if File.file?(file)
   filenames << file.to_s
 end
end
}
于 2011-01-17T16:27:57.877 回答
1

您的 if 语句具有三个路径;第一个返回一个空数组,最后一个返回一个包含在数组中的单个元素。到现在为止还挺好。

但是中间路径返回 的值Dir.entries,它本身返回由 标识的文件夹的所有条目path。迭代器产生递归调用并将它们附加到局部变量的each副作用,但 的返回值不受此影响——它仍然返回文件夹中的所有条目。get_filenamesfilenamesDir.entries

要获得您想要的结果,只需filenames在 Dir.entries 调用之后添加。

于 2011-01-17T20:03:40.803 回答
0

我相信,它发现你的if陈述是真实的,导致它在第一次通过时退出。如果删除那部分逻辑会发生什么(移动elseifif只有ifand else?

于 2011-01-17T16:19:31.020 回答
0

这可以按预期在我的机器上运行。

尝试在参数和每个返回值中添加打印语句,以查看您的案例中实际发生的情况。

您可能认为您正在传递一个值,而实际上您正在传递另一个值。

于 2011-01-17T16:46:04.343 回答