2017-07-04 5 views
0

Ich habe ein Programm, das mehrere Audioformate lesen kann. Ein geteiltes Modul könnte eine Eigenschaft bereitstellen, AudioFileReader, die allgemeine Methoden zum Lesen von Audiodaten sowie eine Registrierung zum Zuordnen von Lesern zu Dateierweiterungen aufweist.Erweiterbare Registrierung von Typen

Anstatt alle möglichen Audioformat-Leser in das Modul zu integrieren, wäre es sinnvoll, dieses Modul erweiterbar zu machen, so dass Clients des Moduls AudioFileReader s für neue Formate bereitstellen können (entweder bei Verknüpfung mit einer ausführbaren Datei oder über ein Stecksystem).

Was wäre ein herkömmlicher Rust-Weg, um ein solches System zu bauen? Gibt es eine Möglichkeit, eine globale statische Registrierung zu vermeiden, ohne die Erweiterbarkeit zu verlieren?

+2

Es klingt, als ob Sie die Antwort kennen (verwenden Sie Merkmale), vielleicht habe ich die Frage falsch verstanden. Kannst du erklären, warum Eigenschaften nicht ausreichend sind? –

+0

Möchten Sie, dass die Module zur Kompilierungszeit oder zur Laufzeit registriert werden? Bei der Kompilierung denke ich, Makros sind die gebräuchlichste Lösung. Zur Laufzeit bin ich mir nicht sicher. – behnam

+0

Zur Laufzeit ermöglicht dies die Verwendung von Plug-in-Systemen und anderen Erweiterungen des Designs. – Tim

Antwort

1

Sie können eine solche Registrierung erstellen, indem Sie eine globale verwenden, die eine Zuordnung des Erweiterungsnamens zu Box<AudioFileReader> enthält.

Sie müssten sie alle in main auflisten (oder haben Hauptaufruffunktionen). Es gibt keine Möglichkeit, dies automatisch zu tun, Rust hat kein Leben vor dem Main.