который означает что на вход он принимает некий Input и следующий Handler<()> (chain of responsibilty по сути). далее я делаю pipe_to() на Handler<()> (следующий обработчик). и я хочу создать третий Handler который берет первый обработчик, передает туда Input и второй обработчик (вызывать ли второй обработчик - решает первый). А лайфтаймы не сходятся - не могу создать этот третий хендлер.
Здесь from_fn() - это хендлер который является кложурой которая замыкает в себе self и child, а потом выдает футуру которая живет может жить столько же, сколько живет этот третий Handler (а, соответственно, и замыкание). но раст выдает как всегда какую-то ересь вместо объяснения ошибки. как мне кажется все должно быть правильно - у нас время жизни футуры, в которую мы кидаем оба хендлера, зависит от времени жизни кложуры, которая замыкает оба хендлера. что я делаю не так?
Чего-то супер переусложненно и непонятно зачем Так не пойдет?: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=bc2e73fe76cf40241a8e1658337cf906
FnOnce не подходит, обработчик на то и обработчик, что может вызываться много раз
Трейт Fn не позволяет описать замыкание, возвращающее ссылку на свои внутренности. Так что в этом виде работать не будет: футура содержит ссылку на внутренность замыкания. Все эти 'a говорят только о том, что замыкания и футура могут содержать ссылки на какие-то внешние по отношению к ним данные. Как исправить? Можно использвать Arc вместо Box и клонировать его
у меня этот код на арках уже есть - я хочу уйти от них
GATы нужны для замены Fn на какой-нибудь trait Call { type Output<'a>; fn call(&self) -> Self::Output<'_>; }. Ну и это ограничит возможности использования: спавнить полученные футуры не получится
спавнить не 'static в принципе невозможно по идеи
Да. Я имею в виду по сравнению с Arc'ами
Обсуждают сегодня