Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Rust问答】要如何实现一个全局变量的初始化(单例)

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

作者头像
MikeLoveRust
发布于 2020-03-25 10:11:39
发布于 2020-03-25 10:11:39
2.6K00
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//创建连接
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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吧

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rust学习笔记Day18 智能指针Cow/MutexGuard
这是用于提供写时克隆(Clone-on-Write)的一个智能指针,和虚拟内存管理的写时复制很像。
用户1072003
2023/02/23
7200
Rust学习笔记Day18 智能指针Cow/MutexGuard
【Rust每周一库】once_cell - 最多初始化一次的cell
once_cell提供了unsync::OnceCell和sync::OnceCell这两种Cell(字面意思,前者用于单线程,后者用于多线程),用来存储堆上的信息,并且具有最多只能赋值一次的特性。API大概是:
MikeLoveRust
2020/12/18
6.8K0
【Rust 日报】2023-11-26 Rust全局变量,两年过去了
2021 年 11 月,我写了一篇博文,研究了 Rust 与全局变量的奇怪关系。它旨在解释为什么这种无处不在的语言特性需要外部 crates,并以关于在新代码中使用全局变量的个人建议结束。两年过去了,Rust 已经发生了很大的变化,是时候重新审视一下了。本文的其余部分假定您已经阅读了上一篇文章或熟悉该主题。
MikeLoveRust
2023/11/28
7550
【Rust 日报】2023-11-26 Rust全局变量,两年过去了
基于 actix、async-graphql、rbatis 构建异步 Rust GraphQL 服务(3)- 重构
首先,我们通过 shell 命令 cd ./actix-web-async-graphql-rbatis/backend 进入后端工程目录(下文中,将默认在此目录执行操作)。
niqin.com
2022/06/30
1.4K0
基于 actix、async-graphql、rbatis 构建异步 Rust GraphQL 服务(3)- 重构
rust写操作系统 rCore tutorial 学习笔记:实验指导二 内存分配与管理
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/11
7210
透过 Rust 探索系统的本原:并发原语
几周前我写了篇关于并发的文章(透过 rust 探索系统的本原:并发篇),从使用者的角度介绍了常用的处理并发的工具:Mutex / RwLock / Channel,以及 async/await。今天我们讲讲这些并发手段背后的原语。这些原语,大家在操作系统课程时大多学过,但如果不是做一些底层的开发,估计大家都不记得了。今天,我们就来简单聊聊这些基础的并发原语,了解它们的差异,明白它们使用的场景,对撰写高性能的并发应用有很大的帮助。
tyrchen
2021/04/07
1.1K0
透过 Rust 探索系统的本原:并发原语
【Rust每周一知】Rust中的读写锁RwLock
在计算机科学中,有一些经典的同步问题,读者-作家问题就是其中一个,该问题涉及多个并发线程试图同时访问同一共享资源的情况。
MikeLoveRust
2020/04/07
4.7K0
【翻译】从头实现Rust异步执行器
原文:https://stjepang.github.io/2020/01/31/build-your-own-executor.html 现在我们已经构建了block_on函数,是时候进一步将其转换为一个真正的执行器了。我们希望我们的遗执行器不只是一次运行一个future,而是同时运行多个future!
MikeLoveRust
2020/07/23
9110
Rust学习笔记Day15 标记trait有哪些常用trait
昨天我们一起学习了 内存相关的3个常用trait Clone/Copy/Drop。
用户1072003
2023/02/23
3960
Rust学习笔记Day15 标记trait有哪些常用trait
Rust 中的 QUIC 实现 --- quinn
QUIC 是基于 UDP 的多路复用、安全传输协议。可以简单理解为在用户空间将 TCP 里的机制实现了一遍,比如拥塞控制、流量控制等。好处是升级比较方便,TCP 协议栈是内核中实现的,只能随内核升级,而 QUIC 可灵活升级。
谛听
2022/01/30
4.2K0
rust写操作系统 rCore tutorial 学习笔记:实验指导五 驱动与文件
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/11
7830
Rust的第二次接触-写个小服务器程序
蛮久前入门了一下 Rust 语言。它的设计模型非常地吸引C/C++的开发者。但是学习语言嘛还是要练习一下,之前也用它给我们项目写了个命令行小工具。这回拿来写个小型的服务器程序吧。
owent
2018/10/09
4.2K2
【翻译】200行代码讲透RUST FUTURES (2)
在我们深入研究 Futures in Rust 的细节之前,让我们快速了解一下处理并发编程的各种方法,以及每种方法的优缺点。
MikeLoveRust
2020/07/28
7640
用Actix写的一个类似于Facemash的小项目总结
在入口文件中,首先启用了一些库的宏(Macro),并声明了 Actix-Web 框架的 main 函数;
MikeLoveRust
2022/11/28
4670
【翻译】200行代码讲透RUST FUTURES (7)
我们将用一个伪reactor和一个简单的执行器创建我们自己的Futures,它允许你在浏览器中编辑和运行代码
MikeLoveRust
2020/08/05
1.3K0
深入理解Rust的Atomic及Ordering
之前提到的Mutex、Condvar是Rust中比较偏高层的共享数据型并发控制,更底层的并发控制也有,比如Atomic(原子操作)。
newbmiao
2023/12/26
6040
深入理解Rust的Atomic及Ordering
Rust Async: async-task源码分析
本文转载自知乎地址:https://zhuanlan.zhihu.com/p/92679351?utm_source=wechat_session&utm_medium=social&utm_oi=5
MikeLoveRust
2019/11/24
1.5K0
rust写操作系统 rCore tutorial 学习笔记:实验指导三 虚拟地址与页表
这是 os summer of code 2020 项目每日记录的一部分: 每日记录github地址(包含根据实验指导实现的每个阶段的代码):https://github.com/yunwei37/os-summer-of-code-daily
云微
2023/02/11
7510
构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(3)- 重构
行文开始,先感谢几位指导的老师。相关标题和内容都已经在博客站点修改,微信公众号中就不重复推送了。
niqin.com
2022/06/30
9890
构建 Rust 异步 GraphQL 服务:基于 tide + async-graphql + mongodb(3)- 重构
Rust 赋能前端: 视频抽帧
大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder
前端柒八九
2025/01/03
1300
Rust 赋能前端: 视频抽帧
相关推荐
Rust学习笔记Day18 智能指针Cow/MutexGuard
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验