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

}
相关推荐
z落落3 分钟前
C# 事件(Event)+自定义带参数事件例子
开发语言·分布式·c#
FlYFlOWERANDLEAF3 分钟前
DevExpress Office File API使用记录
开发语言·c#·devoffice
程序员二叉6 分钟前
【JVM】OOM详解+JVM参数+FullGC排查+CPU飙高+死锁+内存泄漏+命令大全
java·开发语言·jvm·面试
yijianace17 分钟前
Python线程与多线程完全总结(从入门到理解并发本质)
开发语言·python
不知名的老吴25 分钟前
线程的生命周期之线程同步
java·开发语言·jvm
J2虾虾1 小时前
C 语言 void 完全用法
c语言·开发语言
会Tk矩阵群控的小木1 小时前
基于Python的iMessage短信群发与社媒多账号统一管理系统实现
开发语言·windows·python·新媒体运营·开源软件·个人开发
我是一颗柠檬1 小时前
【Java项目技术亮点】分库分表+数据路由策略:单表5000万后的架构升级方案
java·开发语言·分布式·架构
wu_ye_m1 小时前
学习c语言第35天 函数声明和定义
c语言·开发语言·学习
njsgcs2 小时前
c# solidworks 创建装配体工程图+bom
开发语言·c#·solidworks