[英]Learning Ruby: return value
我正在學習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”]
首先, 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
這是查詢的簡單解決方案...查找當前目錄和子目錄中存在的每個文件
{Find.find("", "#{path}") do |file|
if File.file?(file)
filenames << file.to_s
end
end
}
您的if語句具有三個路徑; 第一個返回一個空數組,最后一個返回包裝在數組中的單個元素。 到現在為止還挺好。
但是中間路徑返回Dir.entries
的值,該值本身返回path
標識的文件夾的所有條目。 each
迭代器都會產生遞歸調用get_filenames
並將它們附加到局部變量filenames
的Dir.entries
,但是Dir.entries
的返回值不受此影響-它仍返回文件夾中的所有條目。
要獲得所需的結果,只需在Dir.entries調用后添加filenames
即可。
我相信,這是在發現您的if
語句為真,導致它在第一次通過時退出。 如果刪除邏輯的那部分會發生什么(將elseif
移至if
,如果只有if
and else
?
這可以在我的機器上正常運行。
嘗試在參數和每個返回值中添加打印語句,以查看實際情況。
實際上,當您傳遞另一個值時,您可能認為您正在傳遞一個值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.