Синглтон с использованием owning_ref::MutexGuardRef


#1

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);
}

Playground

При попытке реального использования expect'ы может иметь смысл заменить на более аккуратную обработку ошибок.

Просто делюсь, вдруг кому пригодится когда-нибудь. :slight_smile: