Size: a a a

2020 December 18

MB

Mikail Bagishov in Rust Beginners
Alexander T
Abortable<Future<Output = ()>>
doesn't have a size known at compile-time
Box<dyn Future<Output = ()>>
источник

MB

Mikail Bagishov in Rust Beginners
Точнее Pin<Box<...>>
источник

AT

Alexander T in Rust Beginners
Mikail Bagishov
Точнее Pin<Box<...>>
тогда простите за тупой вопрос, а как из Abortable::new() сделать Pin<Box>?
источник

K

Kitsu in Rust Beginners
Alexander T
тогда простите за тупой вопрос, а как из Abortable::new() сделать Pin<Box>?
Лучш параметризовать дженериком и не боксить ничего
источник

AT

Alexander T in Rust Beginners
отбой, все сломалось.
dyn futures::Future<Output = ()> + 'static)` cannot be sent between threads safely
надо мне что-то другое придумывать
источник

IB

Ivan Boldyrev in Rust Beginners
Kitsu
Лучш параметризовать дженериком и не боксить ничего
It depends. Ему их нужно складывать в контейнер.
источник

IB

Ivan Boldyrev in Rust Beginners
Alexander T
отбой, все сломалось.
dyn futures::Future<Output = ()> + 'static)` cannot be sent between threads safely
надо мне что-то другое придумывать
Pin<Box<dyn Futures ... + Sync + Send>>
источник

K

Kitsu in Rust Beginners
struct MegaTimer<F> {
 future: Abortable<F>
 abort_handle: AbortHandle,
}

async fn timer_future(...) -> MegaTimer<impl Future<Output = ()>> { .. }


что-то такое кажется должно работать
источник

АГ

Алексей Герасимов... in Rust Beginners
Alexander T
ну, процедуры же бывают)
Процедура это функция, возвращающая unit (() )
источник

AT

Alexander T in Rust Beginners
Kitsu
struct MegaTimer<F> {
 future: Abortable<F>
 abort_handle: AbortHandle,
}

async fn timer_future(...) -> MegaTimer<impl Future<Output = ()>> { .. }


что-то такое кажется должно работать
это все сильно усложняет, потому что много где появляется этот <F>
попробую с + Sync + ...
источник

K

Kitsu in Rust Beginners
Alexander T
это все сильно усложняет, потому что много где появляется этот <F>
попробую с + Sync + ...
зато зирокостненько и блейзинг фаст
источник

AT

Alexander T in Rust Beginners
а можно как-то конкретизировать параметр? чтоб не писать везде <F>
источник

K

Kitsu in Rust Beginners
Ну и да, к подобным "протеканиям" стоит быть готовым. Не переписывать же половину кода, если вдруг один внутренний тип внезапно надо будет параметризовать. В частности если обобщить State, то вероятно подобная проблема для *State типов уйдет
источник

K

Kitsu in Rust Beginners
Alexander T
а можно как-то конкретизировать параметр? чтоб не писать везде <F>
Можно написать свой тип-футуру, но мне кажется ты этого не хочешь
источник

AT

Alexander T in Rust Beginners
Kitsu
Можно написать свой тип-футуру, но мне кажется ты этого не хочешь
может, я вообще не то делаю?) не знаю, как идиоматичнее.
источник

IB

Ivan Boldyrev in Rust Beginners
А вообще зачем тебе хранить Abortable? Тебе его надо отправить на выполнение.  А в таймере хранить только AbortHandle.
источник

AT

Alexander T in Rust Beginners
есть tbot, у которого хендлеры - |context, state| async move { … }
в хендлере я могу получить доступ к state.read().await

при создании бота происходит:
let bot = Bot::from_env("TG_TOKEN");
let start_state = State::
default();
[СЮДА]
let mut event_loop = bot.stateful_event_loop(start_state);
event_loop.command(
);

event_loop.polling().start().await.unwrap();


в [СЮДА] мне нужно создать футуру и положить ее в стейт, чтобы хендлеры могли из стейта останавливать/ресетать/стартовать
источник

AT

Alexander T in Rust Beginners
сформулировал на случай проблемы XY
источник

AT

Alexander T in Rust Beginners
Ivan Boldyrev
А вообще зачем тебе хранить Abortable? Тебе его надо отправить на выполнение.  А в таймере хранить только AbortHandle.
эти футуры обычно крутятся вечно, выполнилось - и заново пошла.
источник

IB

Ivan Boldyrev in Rust Beginners
Футуры разве не одноразовые?
источник