2017-07-04 63 views
0

我有一个程序,可以读取多种音频格式。共享模块可以提供特征AudioFileReader,其具有用于读取音频数据的通用方法以及用于将读取器与文件扩展名相关联的注册表。类型的可扩展注册表

与模块中内置的所有可能的音频格式阅读器不同,模块的可扩展性非常有用,因此模块的客户端可以为新格式提供AudioFileReader(当链接到可执行文件或通过插件系统)。

什么是传统的Rust方法来构建这样的系统?有没有办法避免需要全局静态注册表,同时不会失去可扩展性?

+2

这听起来像你知道答案(使用特征),所以也许我误解了这个问题。你能否解释为什么性状不够充分? –

+0

您是否希望模块在编译时或运行时注册?如果编译时,我认为宏是最常见的解决方案。对于运行时,我不确定。 – behnam

+0

在运行时,允许使用插件系统和其他设计扩展。 – Tim

回答

1

您可以使用lazy_static global来构建此类注册表,其中包含扩展名为Box<AudioFileReader>的映射。

你将不得不在主要(或主要调用init函数)中列出它们。没有办法自动做到这一点,铁锈在主要之前没有生命。