2017-07-04 60 views
0

我有一個程序,可以讀取多種音頻格式。共享模塊可以提供特徵AudioFileReader,其具有用於讀取音頻數據的通用方法以及用於將讀取器與文件擴展名相關聯的註冊表。類型的可擴展註冊表

與模塊中內置的所有可能的音頻格式閱讀器不同,模塊的可擴展性非常有用,因此模塊的客戶端可以爲新格式提供AudioFileReader(當鏈接到可執行文件或通過插件系統)。

什麼是傳統的Rust方法來構建這樣的系統?有沒有辦法避免需要全局靜態註冊表,同時不會失去可擴展性?

+2

這聽起來像你知道答案(使用特徵),所以也許我誤解了這個問題。你能否解釋爲什麼性狀不夠充分? –

+0

您是否希望模塊在編譯時或運行時註冊?如果編譯時,我認爲宏是最常見的解決方案。對於運行時,我不確定。 – behnam

+0

在運行時,允許使用插件系統和其他設計擴展。 – Tim

回答

1

您可以使用lazy_static global來構建此類註冊表,其中包含擴展名爲Box<AudioFileReader>的映射。

你將不得不在主要(或主要調用init函數)中列出它們。沒有辦法自動做到這一點,鐵鏽在主要之前沒有生命。