可扩展的类型注册

Extensible registry of types

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

与其将所有可能的音频格式阅读器内置到模块中,不如让该模块具有可扩展性,这样模块的客户端可以为新格式提供 AudioFileReaders(无论何时链接到可执行文件或通过插件系统)。

构建这样一个系统的传统 Rust 方法是什么?有没有办法在不失去可扩展性的情况下避免需要全局静态注册表?

您可以使用 lazy_static 全局构建这样的注册表,其中包含扩展名到 Box<AudioFileReader> 的映射。

您必须将它们全部列在 main 中(或者让 main 调用 init 函数)。没有办法自动执行此操作,Rust 在 main 之前没有生命。