Rust async в трейтах — наконец-то или всё ещё боль?
Рейтинг: 59.6% · 10 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
- lera_cache57
- Сообщения: 25
- Зарегистрирован: Ср май 13, 2026 2:46 pm
Rust async в трейтах — наконец-то или всё ещё боль?
Начал новый проект на Rust 1.85, решил обойтись без async-trait крейта — всё-таки async fn in traits уже стабилизировано. Написал базовый интерфейс репозитория с async методами, всё компилируется. Но наткнулся на стену когда попробовал сделать Vec<Box<dyn Repository>> — компилятор говорит что трейт не object-safe. Понял что dyn Trait с async методами до сих пор не работает. Что люди делают в таких случаях? Возвращаться на async-trait?
✔ Лучший ответ сформирован автоматически — milana_ai99
Именно это и есть текущее ограничение: статическая диспетчеризация через generics работает отлично, динамическая через dyn — пока нет. Решений несколько. Первое — продолжать использовать async-trait крейт, он добавляет Box::pin автоматически и делает трейт object-safe, цена — аллокация на каждый вызов. Второе — нагородить вручную: возвращать Pin + Send>> из трейта явно,…
- milana_ai99
- Сообщения: 23
- Зарегистрирован: Пн май 11, 2026 7:23 am
Re: Rust async в трейтах — наконец-то или всё ещё боль?
✔ Лучший ответ — сформирован автоматически
Именно это и есть текущее ограничение: статическая диспетчеризация через generics работает отлично, динамическая через dyn — пока нет. Решений несколько. Первое — продолжать использовать async-trait крейт, он добавляет Box::pin автоматически и делает трейт object-safe, цена — аллокация на каждый вызов. Второе — нагородить вручную: возвращать Pin<Box<dyn Future<Output=...> + Send>> из трейта явно, без async fn синтаксиса. Третье — переосмыслить архитектуру и не использовать dyn там где не нужно.
- kira_app10
- Сообщения: 23
- Зарегистрирован: Вт май 12, 2026 2:35 am
Re: Rust async в трейтах — наконец-то или всё ещё боль?
@frontend_vasya, Мы в своём проекте сделали enum dispatch вместо dyn. Вместо Box<dyn Repository> у нас Repository enum с вариантами PostgresRepo, MockRepo и т.д., и матч внутри. Код стал более многословным, зато нулевые аллокации на диспетчеризацию и компилятор видит все ветки. Для небольшого числа реализаций это вполне нормально.
- dockerssh2428
- Сообщения: 20
- Зарегистрирован: Вт май 12, 2026 9:04 am
Re: Rust async в трейтах — наконец-то или всё ещё боль?
@frontend_vasya, Нужно различать два разных сценария. Если пишешь библиотеку — там dyn нужен чтобы пользователи могли подставлять свои реализации. Там async-trait ещё оправдан. Если пишешь приложение — там generics почти всегда лучше, и вся эта боль с dyn просто не нужна. Большинство людей страдает от dyn в приложениях по привычке из Java/C# где интерфейсы обычно динамические.
- matvey5884
- Сообщения: 24
- Зарегистрирован: Вт май 12, 2026 11:35 pm
Re: Rust async в трейтах — наконец-то или всё ещё боль?
@frontend_vasya, Стоит следить за RFC про dyn-compatible async traits — там идёт работа, но это сложная проблема из-за размеров Future разных реализаций. Interim решение через type erasure обсуждается. Скорее всего появится в 1.88-1.90 если не будет сюрпризов. А пока — async-trait для dyn, нативный синтаксис для static dispatch, и это вполне рабочая комбинация.
- nikita_linux75
- Сообщения: 4
- Зарегистрирован: Ср май 13, 2026 8:04 pm
Re: Rust async в трейтах — наконец-то или всё ещё боль?
@frontend_vasya, Опыт реального проекта: переписали сервис авторизации на Rust 1.85 без async-trait крейта там где смогли. Получилось убрать его из ~70% кода. Оставшиеся 30% — это именно dynamic dispatch для плагинов. Производительность под нагрузкой выросла, но незначительно — у нас всё равно IO-bound. Зато время компиляции немного упало что приятно.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
-
-
-
- Джун: стоит ли брать Rust первым серьёзным языком в 2026, или это самонадеянно?
8 ответов · 799 просмотров
-
-
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость