2012-01-19 78 views
0

我想通過遍歷一個目錄結構來動態加載代碼,並動態加載我在那裏找到的任何模塊。如何動態地將模塊包含在嵌套目錄中?

這樣做的目的是運行一系列驗證。如果頂級驗證失敗,則不會運行任何子驗證。

我的想法是,一個控制器對象可以掃描目錄,建立模塊的層次結構,然後根據高級驗證的成功/失敗來決定是否遍歷樹的特定部分。

例如,我可能會對一個正則表達式運行一系列驗證,但是,如果正則表達式不存在或爲空,則不應運行任何驗證。在這種情況下,頂級目錄將包含exists驗證,並且如果存在正則表達式,則子目錄將包含要運行的所有其他驗證。

能夠在單獨的文件中定義這些驗證並創建所需的層次結構對於以後輕鬆添加其他驗證非常有用,而不是必須破解打開現有類並添加方法。

有沒有辦法讓應用程序可以動態地掃描目錄,將文件名保存在集合中,然後在需求中使用該集合的元素?我不這麼認爲。什麼是負載?

有什麼辦法可以實現這樣的設計嗎?或者我想這些都是錯誤的,應該考慮一些其他的方法?

+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加載它。

您可以在「互聯網」上找到其他示例,顯示人們如何使用FindDir模塊也有類似的功能,使用glob,只有你必須告訴它在哪裏下降,然後可以迭代返回的結果。

+0

找到目錄和文件列表後,您可以通過它們遍歷它們,以便在需要檢查的任何條件之後要求該文件名。 – roberocity

+1

@roberocity,是的。我打算補充一點,但被召進會議。 –

+1

+1來參加會議。 :) – roberocity

相關問題