专栏首页Rust语言学习交流【Rust问答】要如何实现一个全局变量的初始化(单例)

【Rust问答】要如何实现一个全局变量的初始化(单例)

//创建连接
pub fn establish_connection() -> Arc<Pool> {
    static mut POOL: Mutex<Option<Arc<Pool>>> = Mutex::new(None);
    unsafe {
        POOL.lock().unwrap().get_or_insert_with(||
            {
                println!("init pool ..");
                Arc::new(Pool::new(URL).unwrap())
            }
        )
            .clone()
    }
}

Mutex::new(None); static 变量中又不允许出现 非 const fn,怎么能实现这个需求呢

---

juzi5201314 2020-03-12 12:51

这个需求的话,可以看看lazy_static和once_cell这个库

juzi5201314 2020-03-12 12:58

once_cell:

use once_cell::sync::Lazy;

static POOL: Lazy = Lazy::new(|| Pool::new(URL).unwrap());
...
POOL.xxxx;


use once_cell::sync::OnceCell;

static POOL: OnceCell= OnceCell::new();
...
let pool = POOL.get_or_init(|| Pool::new(URL).unwrap());
...
POOL.set(Pool::new(URL).unwrap());
let pool = POOL.get().unwrap();

lazy_static:

lazy_static!{
static ref POOL: Mutex = Mutex::new(Pool::new(URL).unwrap());
}

juzi5201314 2020-03-12 13:09

嗷打少了Lazy,OnceCell,Mutex的<Pool>

phper-chen 2020-03-12 13:25

?

作者 LayneYy 2020-03-12 13:57

谢谢啦,刚接触rust,还不太熟练这个风格的变成,我发现很多都需要依赖标准库之外的

alexlee85 2020-03-18 17:53

如果你初始化之后不更新你的单例变量的话没必要用Mutex吧

use std::sync::Arc;

pub struct Pool {
    pub name: String,
}

pub fn establish_connection() -> Arc<Pool> {
    static mut POOL: Option<Arc<Pool>> = None;
    unsafe {
        Arc::clone(POOL.get_or_insert_with(|| {
            println!("init pool ~~~~~~~~~~~~");
            Arc::new(Pool {
                name: "I'm a pool".to_string(),
            })
        }))
    }
}

fn main() {
    let a = establish_connection();
    println!("{}", a.name);
    
    let b = establish_connection();
    println!("{}", b.name);
}

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=3cf7b2701b7901e3db01838f9dec26ba

本文分享自微信公众号 - Rust语言学习交流(rust-china),作者:LayneYy

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【Rust日报】 2019-07-26:Rust 碎形程式

    這位網友想組一台 Ryzen 9 3900X + Samsung 970 EVO Plus SSD

    MikeLoveRust
  • 从Rust到远方:C星系

    来源:https://mnt.io/2018/09/11/from-rust-to-beyond-the-c-galaxy/

    MikeLoveRust
  • 【Rust日报】 2019-12-17 hyper v0.13.0的最终版本现已准备就绪

    有时候你看到一张动态图片(GIF),感觉其中的一个画面你觉得很不错,想从中提取出来. 这篇文章会教你如何用Rust来完成提取(https://pudymody....

    MikeLoveRust
  • R语言信息可视化——文字云

    这一篇跟大家分享R语言信息可视化——文字云。 R语言可以轻松处理信息可视化,并且很早就有专用的信息可视化包——WordCloud。 可是这个第一版的文字云工具,...

    数据小磨坊
  • 常用正则

    6 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$

    十四君
  • 常用正则表达式(高亮,markdown) 原

    1.oscer 们会喜欢用 Markdown 编辑器吗:https://www.oschina.net/question/12_75077

    晓歌
  • Sublime有多好用?多点编辑Markdown写作

    sublime text sublime是一款文本编辑器,特点是操作流畅,无卡顿,界面炫酷,问世的时候,凭借首创的"代码小地图",和"多点编辑",甩出其它编辑器...

    zhaoolee
  • MySQL数据导入Hive-Java

    Sqoop并不在这篇文章的范围内,拿出来说的原因是,公司数据研发部门是通过Sqoop将数据库数据导入到Hive中,其原理是将数据库数据导入到HDFS中临时存储,...

    每天学Java
  • 还有这种操作,可以让装饰器为所欲为?

    今天是Python专题的第14篇文章,我们继续装饰器的话题,来看看怎么给装饰器包装方法,实现更多灵活的操作。

    TechFlow-承志
  • 18-GPRS(Air202)拨打电话

    源码打包出售  https://item.taobao.com/item.htm?spm=a2126o.11854294.0.0.3e3a4831ODxjIk...

    杨奉武

扫码关注云+社区

领取腾讯云代金券