rust 单例模式

最近在学习 rust ,想着用rust 实现一个单例 模式(单例 是 一种创建型的设计模式,它保证一个类只有一个实例,并提供一个全局访问点。但是rust 中没有 单例,而且所有变量都会检查所有权和生命周期) ,发现网上很多都是用第三方库实现的,这个是我琢磨出来的 一种单例的实现方式,欢迎各位大佬指教。

话不多说直接放具体代码了
详细代码
singleton_learn.rs

rust 复制代码
#[derive(Clone, Copy, Debug)]
struct Sing {
    i1: i32,
    f1: f32,
    u1: u32,
    b1: bool,
}

pub struct Singleton {
    str: &'static str,
    age: i32,
    sig: Sing,
    isinit: bool,
}

pub static mut SINGLETON: Singleton = Singleton {
    str: "11111",
    age: 55,
    sig: Sing {
        i1: 1,
        f1: 2.0,
        u1: 3,
        b1: true,
    },
    isinit: false,
};

impl Singleton {
    pub fn set_str(&mut self, str: &'static str) {
        self.str = str;
    }
    pub fn set_age(&mut self, age: i32) {
        self.age = age;
    }
    pub fn set_sig(&mut self, sig: Sing) {
        self.sig = sig;
    }
    pub fn get_str(&self) -> &'static str {
        self.str
    }
    pub fn get_age(&self) -> i32 {
        self.age
    }
    pub fn get_sig(&self) -> Sing {
        self.sig
    }
}

pub fn get_singleton() -> *mut Singleton {
    unsafe {
        let prt = &raw mut SINGLETON;
        let pr = &mut *prt;
        return prt;
    }
}

pub fn get_singleton_ref() -> &'static mut Singleton {
    unsafe {
        let sng = &raw mut SINGLETON;
        let s = &mut *sng;
        return s;
    }
}

#[test]
pub fn fn1() {
    println!("age is {}", get_singleton_ref().get_age());
    get_singleton_ref().set_age(7777777);
    //get_singleton_ref().get_age();
    println!("age is {}", get_singleton_ref().get_age());
    unsafe {
        let sng = get_singleton();
        (*sng).set_str("22222");
        (*sng).set_age(66);
        (*sng).set_sig(Sing {
            i1: 4,
            f1: 5.0,
            u1: 6,
            b1: false,
        });
        println!("str is {}", (*sng).get_str());
        println!("age is {}", (*sng).get_age());
        println!("sig is {:#?}", (*sng).get_sig());
    }
}

main.rs 里的调用

rust 复制代码
fn main() {
 design_patterns_learn::singleton_learn::fn1();
    println!(
        "age is {}",
        design_patterns_learn::singleton_learn::get_singleton_ref().get_age()
    );
    design_patterns_learn::singleton_learn::get_singleton_ref().set_age(6666666);
    println!(
        "age2 is {}",
        design_patterns_learn::singleton_learn::get_singleton_ref().get_age()
    );
  

}
相关推荐
光电笑映2 小时前
C++11 新特性全解:语法糖、容器进化与可调用对象包装
开发语言·c++
qq_白羊座2 小时前
Langchain、Cursor、python的关系
开发语言·python·langchain
kiku18182 小时前
Python网络编程
开发语言·网络·python
小李子呢02112 小时前
前端八股3---ref和reactive
开发语言·前端·javascript
SWAGGY..2 小时前
【C++初阶】:(7)STL简介
开发语言·c++
dog2502 小时前
卡瓦列里积分赏析
开发语言·php
流星蝴蝶没有剑2 小时前
CoPaw Agent 对接 Python 客户端开发指南:实现流式响应与实时打印
开发语言·python
咬_咬2 小时前
go语言学习(数组与切片)
开发语言·学习·golang·数组·切片
小陈工3 小时前
Python Web开发入门(十八):跨域问题解决方案——从“为什么我的请求被拦了“到“我让浏览器乖乖听话“
开发语言·python·机器学习·架构·数据挖掘·回归·状态模式