Асинхронні трейти
Асинхронні методи у трейтах було стабілізовано у випуску 1.75. Це вимагало підтримки використання impl Trait
з позицією повернення у трейтах, оскільки десигнування для async fn
включає -> impl Future<Output = ...>
.
Однак, навіть з нативною підтримкою, існують деякі підводні камені навколо async fn
:
-
Позиція повернення
impl Trait
фіксує всі терміни життя в межах області застосування (тому деякі моделі запозичення не можуть бути виражені). -
Асинхронні трейти не можна використовувати з об’єктами трейтів (підтримка
dyn Trait
).
Крейт async_trait надає обхідний шлях за допомогою макросу, з деякими застереженнями:
Speaker Notes
This slide should take about 5 minutes.
-
async_trait
простий у використанні, але зауважте, що для цього він використовує виділення в купі. Цей розподіл купи має накладні витрати на продуктивність. -
Проблеми мовної підтримки
async trait
є надто глибокими, щоб детально описати їх у цьому уроці. Якщо ви зацікавлені у глибшому вивченні, перегляньте цей запис у блозі Ніко Мацакіса. Дивіться також ці ключові слова:- RPIT: скорочення від return-position
impl Trait
. - RPITIT: скорочення від return-position
impl Trait
у трейті (RPIT у трейті).
- RPIT: скорочення від return-position
-
Спробуйте створити нову сплячу структуру, яка буде спати протягом випадкового періоду часу, і додайте її до
Vec
.