Странный синтаксис обратного вызова (нужно объяснение) - PullRequest
0 голосов
/ 12 ноября 2018

Следующий пример - это минимальный пример, который я обнаружил, который объясняет проблему, с которой я столкнулся:

use std::borrow::BorrowMut;
use std::ops::DerefMut;

#[derive(Debug, Clone)]
enum ConnectionState {
    NotStarted,
}

type StateChangedCallback = Box<FnMut(ConnectionState) + Send + Sync>;

fn thread_func(mut on_state_changed: StateChangedCallback) {
    let new_state = ConnectionState::NotStarted;
    let f: &mut BorrowMut<StateChangedCallback> = &mut on_state_changed;
    f.borrow_mut().deref_mut()(new_state);
}

fn main() {
    let on_state_changed = Box::new(|new_state| {
        println!("New state: {:?}", new_state);
    });

    let join_handle = std::thread::spawn(|| thread_func(on_state_changed));

    join_handle.join().unwrap();
}

У меня есть простой поток, которому нужно вызвать обратный вызов, переданный из main.Обратным вызовом является подпись Box<FnMut(ConnectionState) + Send + Sync>, так как я хочу вызвать ее несколько раз.Единственный способ, которым мне удалось вызвать обратный вызов, был с этим странным синтаксисом:

let f: &mut BorrowMut<StateChangedCallback> = &mut on_state_changed;
f.borrow_mut().deref_mut()(new_state);

Я искал и не нашел разумного объяснения этому.Я делаю что-то не так?Или так работает Rust?

Если это так, может кто-нибудь объяснить причину этого синтаксиса?

1 Ответ

0 голосов
/ 12 ноября 2018

Вы слишком усложняете вещи.

Вы можете объяснить, почему вы думаете, что вы должны сделать borrow_mut(), поскольку в вашей подписи нет заимствований.

Ваша функция thread_func может быть упрощена до этого:

fn thread_func(mut on_state_changed: StateChangedCallback) {
    let new_state = ConnectionState::NotStarted;
    on_state_changed(new_state);
}

Обратите внимание, что в отличие от вашего предложения «Я хочу вызвать его (обратный вызов) несколько раз» вы не можете, потому что вы перемещаете свое замыкание в функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...