https://docs.rs/owning_ref/0.4.0 довольно занятный крейт. С его помощью можно замутить геттер синглтона, который будет держать замок мьютекса, да еще и при этом преобразовывать тип как нам нужно (разворачивать Option
, в данном случае):
#[macro_use]
extern crate lazy_static; // 1.2.0
extern crate owning_ref; // 0.3.3
mod m {
use std::sync::Mutex;
use owning_ref::MutexGuardRef;
pub struct X {
pub data: u8,
}
lazy_static! {
static ref GLOBAL_X: Mutex<Option<X>> = Mutex::new(None);
}
pub fn set_x(x: X) {
*GLOBAL_X.lock().expect("Can't lock a mutex on the foobar") = Some(x);
}
pub fn x() -> MutexGuardRef<'static, Option<X>, X> {
MutexGuardRef::new(GLOBAL_X.lock().expect("Can't lock a mutex on the foobar"))
.map(|config_opt| config_opt.as_ref().expect("There's no foobar"))
}
}
fn main() {
m::set_x(m::X { data: 0 });
println!("{}", m::x().data);
}
При попытке реального использования expect
'ы может иметь смысл заменить на более аккуратную обработку ошибок.
Просто делюсь, вдруг кому пригодится когда-нибудь.