Как бороться с неизвестными типами - PullRequest
0 голосов
/ 24 апреля 2019

Я работал над тем, чтобы пересмотреть мой проект в Rust, чтобы попробовать его, и одна из вещей, которые я хотел бы сделать, - это система плагинов. Я еще не слишком разбирался в dylib, но сейчас я хотел бы получить правильную архитектуру, чтобы позднее добавить dylib не было слишком сложно.

Мой вопрос касается конфигурации плагинов, я хотел бы вызвать для каждого плагина функцию инициализации и позволить им возвращать объект, который затем передавался бы при каждом вызове их функций. Меня не волнует, что находится в этом объекте; это дело плагина.

Я пытался использовать Box<dyn>, но, конечно, это не работает без черты. Означает ли это, что единственным способом было бы объявить пустую черту, например, PluginConfig, и использовать с ней dyn? Тогда плагины могут просто реализовать эту черту и вернуть ее из своего init. Или я упускаю правильный способ сделать это полностью? Если я правильно понял книгу, то после этого плагин не сможет получить доступ к своим полям, поскольку они не определены в Черте и, следовательно, не будут работать должным образом.

tl; dr Я просто ищу ржавый эквивалент хранения void *.

1 Ответ

5 голосов
/ 24 апреля 2019

Для этого используется метод Rust Box<dyn Any>, который плагин может затем безопасно вернуть к своему собственному типу.

Но вы должны знать, что Rust не имеет стабильного ABI, поэтому, если в вашем интерфейсе плагина есть что-то, что не просто C-совместимо, ваши плагины и ваша основная программа должны быть скомпилированы с одинаковой версией и параметрами компилятора для того, чтобы безопасно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...