172 похожих чатов

Немношк плавятся мозги. буду очень благодарен за помощь. итак, есть вот

такая структура с вот таким методом в сторонней либе (клиент для телеги)
pub struct Listener {
...
}
impl Listener {
pub fn on_update_new_message<F>(&mut self, fnc: F) -> &mut Self
where F: Fn((&EventApi, &UpdateNewMessage)) -> TGResult<()> + Send + Sync + 'static
...
}
}

у меня есть вот такая над ней обертка:
pub struct TgClient {
client: Client
}

хочетя докинуть в структуру метод, который вызывал бы listener.on_update_new_message. в примерах из соответствуюшей илибы туда передается closure, но он создается в main'е, так что static-lifetime ок
и хочется, чтобы внутри closure жил mpsc::Sender, которой мог бы эти апдейты принимать и передавать куда-нибудь наружу

собсна, как сделал:
impl TgClient {
fn start_listen_updates(&mut self, channel: Mutex<mpsc::Sender<Update>>) { // mutex, т.к. Sender не реализует Sync
let listener = self.client.listener();
listener.on_update_new_message(get_new_message_handler(channel));
}
}


fn get_new_message_handler(channel: Mutex<mpsc::Sender<Update>>) -> impl Fn((&EventApi, &UpdateNewMessage)) -> TGResult<()> + 'static {
let local = channel.into_inner().unwrap().clone();
move|(api, update)| {
local.send(Update::NewMessage(update.clone())).unwrap();
Ok(())
}
}

компилятор ругается:
50 | listener.on_update_new_message(get_new_message_handler(channel));
| ^^^^^^^^^^^^^^^^^^^^^ `std::sync::mpsc::Sender<rtdlib::types::update::Update>` cannot be shared between threads safely
...
149 | fn get_new_message_handler(channel: Mutex<mpsc::Sender<Update>>) -> impl Fn((&EventApi, &UpdateNewMessage)) -> TGResult<()> + 'static {
| ----------------------------------------------------------------- within this `impl for<'r, 's> std::ops::Fn<((&'r telegram_client::api::aevent::EventApi, &'s rtdlib::types::update::UpdateNewMessage),)>`


существует ли решение? или канал не вариант и надо как-то через lazy_static всё делать с обработкой апдейтов непосредственно внутри замыкания?

3 ответов

6 просмотров

>но он создается в main'е, так что static-lifetime Нет, у всего, что создаётся внутри мейн функции лайфтайм не статик.

antuan- Автор вопроса
Эрик
>но он создается в main'е, так что static-lifetime...

и правда. тогда почему это работает?.. fn main() { ... let listener = client.listener(); listener.on_update_option(|(api, option)| { ... }) } impl Listener { pub fn on_update_option<F>(&mut self, fnc: F) -> &mut Self where F: Fn((&EventApi, &UpdateOption)) -> TGResult<()> + Send + Sync + 'static { ... } }

antuan
и правда. тогда почему это работает?.. fn main() {...

Потому что если кложура не ловит окружение, у неё нет лайфтайма и её можно заборровить на 'static.

Похожие вопросы

Обсуждают сегодня

читать файл максимально быстро? странный вопрос))
zamtmn
53
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
Кто-нибудь решал проблему с автоматическим скроллингом к выбранной ячейке в TDBGrid в Lazarus? Проблема в том, что есть допустим 3 столбца, третий столбец виден наполовину, вк...
Дмитрий Логинов
1
Приветствуем всех! Устали без проектов? Если вы программист и хотите получать стабильные заказы, компания Elif предлагает вам недельный курс по поиску проектов и их ведению. ...
Elif
1
А чего сейчас в моде вместо Error для эксепшенов? А то я тут внезапно узрел что он не рекомендуется :) У Try::Tiny какой-то совершенно ужасный синтаксис если надо конкретные э...
Denis F
19
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Чорт! Чорт! Чорт! Стала ставить через GetIt (написано же, что ручками не рекомендуется) Сломалось на дублировании моей TSkLabel. Чтож мне ее по всем проектам переименовывать в...
Катерина Свиридова
7
Привет. Сразу скажу, что на C/C++/Rust я не пишу, но тем не менее возникла потребность дебага C/C++/Rust кода. Суть: есть серверное приложение, которое периодически ведёт себ...
ninekeem 🐳
4
Hey someone plz help to resolve my issue here is my table... Log { id user_id type target_ct target_obj_id action_ct action_obj_id workspace_id created_at } i wanna fil...
Rahul Singh
1
всем привет! углубившись в плюсы и начав изучать реверсинг понял, что без асм'а никуда со своими высокоабстрактными представлениями начал изучать механизмы асма, и не совсем п...
9
Карта сайта