Size: a a a

Rust — русскоговорящее сообществo

2020 October 27

Э

Эрик in Rust — русскоговорящее сообществo
polunin.ai
Нет же
Да же.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Если ссылка одна, то все норм
источник

ИЛ

Иван Лещенко... in Rust — русскоговорящее сообществo
polunin.ai
Если ссылка одна, то все норм
Нет
источник

Э

Эрик in Rust — русскоговорящее сообществo
Эта функция инвочит UB. Неважно, сколько там ссылок, это тупо UB.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Компиляторы работают на abstract memory model, а не на CPU memory model.
источник

Э

Эрик in Rust — русскоговорящее сообществo
В абстрактной машине раста эта функция *всегда* инвочит UB, если не паникует внутри, не возвращая ничего.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Эрик
В абстрактной машине раста эта функция *всегда* инвочит UB, если не паникует внутри, не возвращая ничего.
Может уже объяснишь почему?
источник

d

diabolo in Rust — русскоговорящее сообществo
polunin.ai
Нет же
да
источник

Э

Эрик in Rust — русскоговорящее сообществo
polunin.ai
Может уже объяснишь почему?
источник

Э

Эрик in Rust — русскоговорящее сообществo
/nomicon/transmutes.html
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Я все ещё хочу услышать объяснение
источник

Э

Эрик in Rust — русскоговорящее сообществo
А если с объяснениями, то ты ломаешь алиасинг.
источник

Э

Эрик in Rust — русскоговорящее сообществo
А если ты не понимаешь, как ты его ломаешь, то тебе нельзя в unsafe.
источник

Э

Эрик in Rust — русскоговорящее сообществo
Это просто как const_cast позвать на реальную константу, а не иммутабельную переменную в крестах.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Эрик
А если ты не понимаешь, как ты его ломаешь, то тебе нельзя в unsafe.
Ну и ладно. Мне бы просто заглушить компилятор на время.
источник

p

polunin.ai in Rust — русскоговорящее сообществo
Тогда вставлю тупо панику туда)
источник

Э

Эрик in Rust — русскоговорящее сообществo
polunin.ai
Ну и ладно. Мне бы просто заглушить компилятор на время.
>Мне бы заглушить компилятор.
>Ой, а почему программа не работает и результаты тестов какие-то странные.
источник

a

antuan in Rust — русскоговорящее сообществo
немношк плавятся мозги. буду очень благодарен за помощь.
итак, есть вот такая структура с вот таким методом в сторонней либе (клиент для телеги)
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 всё делать с обработкой апдейтов непосредственно внутри замыкания?
источник

a

antuan in Rust — русскоговорящее сообществo
простите за многабукав, сам не ожидал :(
источник

AV

Andrey Vlasov in Rust — русскоговорящее сообществo
Эрик
>Мне бы заглушить компилятор.
>Ой, а почему программа не работает и результаты тестов какие-то странные.
Язык плохой
источник