相比RefCell还能拿到内部对象的可变引用,连可变引用都见不到的Cell和OnceCell就更安全了,它们主动放弃了很多灵活性,换取了无需运行时检查的性能。 线程安全 std::cell内的三个类型并不是线程安全的。不过,RefCell有线程安全版本的对应:RwLock,OnceCell也有线程安全的版本OnceLock。相信RwLock要比RefCell常用和常见很多,...
而且使用OnceCell还可以嵌入到结构体中 usestd::{fs, path::PathBuf}; useonce_cell::unsync::OnceCell; struct Ctx{ config_path: PathBuf, config: OnceCell<String>, } implCtx { pubfn get_config(&self) ->Result<&str, std::io::Error> { letcfg =self.config.get_or_try_init(|| { fs:...
提供了和这两种Cell(字面意思,前者用于单线程,后者用于多线程),用来存储堆上的信息,并且具有最多只能赋值一次的特性。API大概是: impl OnceCell { fnnew() -> OnceCell { ... } fnset(&self, value: T) ->Result { ... } fnget(&self) ->Option { ... } } 用法 安全的初始化全局变量 usestd...
// use std::cell::OnceCell; // static CACHE: OnceCell<Vec<i32>> = OnceCell::new(); // fn get_data() -> &'static Vec<i32> { // CACHE.get_or_init(|| { // let data = vec![1, 2, 3, 4, 5]; // println!("Initializing cache"); // data // }) // } // let dat...
std::cell内的三个类型并不是线程安全的。不过,RefCell有线程安全版本的对应:RwLock,OnceCell也有线程安全的版本OnceLock。相信RwLock要比RefCell常用和常见很多,因为多线程间的数据同步是一个比引用限制更容易遇到的问题,这也导致了许多人在学习Rust之初就已经在接触Mutex和RwLock这样的锁类型了。
pub struct OnceCell<T> { /* fields omitted */ } 只能写入一次的单元格。 与RefCell 不同,OnceCell 仅提供对其值的共享 &T 引用。与 Cell 不同,OnceCell 不需要复制或替换值来访问它。 例子 #![feature(once_cell)] use std::lazy::OnceCell; let cell = OnceCell::new(); assert!(cell.get()...
但是,除非对 cell 本身具有可变引用,否则只能获得不可更改引用。 有关此结构体的线程安全版本,请参见std::sync::OnceLock。 Examples usestd::cell::OnceCell;letcell = OnceCell::new();assert!(cell.get().is_none());letvalue:&String = cell.get_or_init(|| {"Hello, World!".to_string() })...
usestd::{sync::Mutex,collections::HashMap};useonce_cell::sync::Lazy;useonce_cell::sync::OnceCell;staticGLOBAL_DATA:Lazy<Mutex<HashMap<i32,String>>>=Lazy::new(||{letmutm=HashMap::new();m.insert(13,"chain".to_string());m.insert(74,"queue".to_string());Mutex::new(m)});fnglo...
Has no effect and returnsNoneif theOnceCellhasn’t been initialized. Safety is guaranteed by requiring a mutable reference. Examples #![feature(once_cell)]usestd::lazy::OnceCell;letmutcell:OnceCell<String>=OnceCell::new();assert_eq!(cell.take(),None);letmutcell=OnceCell::new();cell.set...
Cell<T>、RefCell<T> 和OnceCell<T> 类型的值可以通过共享引用 (即常见的 &T 类型) 进行可变,而大多数 Rust 类型只能通过唯一的 (&mut T) 引用进行可变。我们说这些 cell 类型提供 内部可变性 (通过 &T 可变),与表现出 继承可变性 (仅通过 &mut T 可变) 的典型 Rust 类型形成对比。