Следующий пример - это минимальный пример, который я обнаружил, который объясняет проблему, с которой я столкнулся:
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?
Если это так, может кто-нибудь объяснить причину этого синтаксиса?