簡體   English   中英

學習Ruby:返回值

[英]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並將它們附加到局部變量filenamesDir.entries ,但是Dir.entries的返回值不受此影響-它仍返回文件夾中的所有條目。

要獲得所需的結果,只需在Dir.entries調用后添加filenames即可。

我相信,這是在發現您的if語句為真,導致它在第一次通過時退出。 如果刪除邏輯的那部分會發生什么(將elseif移至if ,如果只有if and else

這可以在我的機器上正常運行。

嘗試在參數和每個返回值中添加打印語句,以查看實際情況。

實際上,當您傳遞另一個值時,您可能認為您正在傳遞一個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM