我正在寫使用fileutils
標準庫中對文件操作的小Ruby的命令行應用程序。根據用戶如何調用應用程序,我將要爲包括FileUtils
,FileUtils::DryRun
或FileUtils::Verbose
。如何選擇在Ruby中動態包含哪個版本的模塊?
由於include
是私人的,但我不能把邏輯選擇到對象的initialize
方法。 (這是我的第一個想法,從那以後,我可以只通過對用戶的選擇作爲參數傳遞給new
的信息。)我想出來的,似乎工作的兩個選擇,但我不開心或者:
設置根據用戶的選擇在應用程序的命名空間的全局變量,然後做一個條件包括在類:
class Worker case App::OPTION when "dry-run" include FileUtils::DryRun etc.
創建的子類,其中唯一的區別是哪個版本他們包括
FileUtils
。根據用戶的選擇選擇合適的一個。class Worker include FileUtils # shared Worker methods go here end class Worker::DryRun < Worker include FileUtils::DryRun end class Worker::Verbose < Worker include FileUtils::Verbose end
第一種方法似乎乾兒,但我希望有更多的東西簡單,我沒有想到的。
「那又怎樣」正確的聲音給我。 (這正是*我看不到的更直接的事情。)謝謝。 – Telemachus 2010-07-29 00:52:50
糟糕,我的錯誤。我之前給出的代碼將修改'Worker'類,所有'Worker's將使用相同的設置。現在它實際上使用元類並允許工作前設置。 – taw 2010-07-29 01:52:10
,而不是'(類<<自我;包括fileutils中端)'你也可以使用'擴展FileUtils'。 – 2010-07-29 04:23:11