[feature(once_cell)]usestd::lazy::OnceCell;letcell = OnceCell::new();letvalue = cell.get_or_init(||92);assert_eq!(value, &92);letvalue = cell.get_or_init(||unreachable!());assert_eq!(value, &92);
OnceCell 的初始化是通过调用其 get_or_init 方法来完成的,该方法接受一个闭包作为参数,该闭包在第一次调用时将被调用,返回值将被存储在 OnceCell 中。在后续调用 get_or_init 方法时,闭包不会被再次执行,而是返回已经初始化过的值。 以下是一个简单的例子,演示如何使用 OnceCell 来实现懒加载: use std::...
#[derive(Debug)]structOp{text:String,}implOp{fnnew() ->Self{Op{text:"hello".to_string(),}}}#[test]fntest_std_onceCell_static_op(){staticmut cell:OnceCell<Op> =OnceCell::new();unsafe{ cell.get_or_init(||Op::new());let option = cell.get();println!("{:?}", option);let...
// 官方文档的示例usestd::cell::OnceCell;letcell=OnceCell::new();assert!(cell.get().is_none());letvalue:&String=cell.get_or_init(||{"Hello, World!".to_string()});assert_eq!(value,"Hello, World!");assert!(cell.get().is_some()); OnceCell的用途相比Cell和RefCell都更加局限,它的...
// 官方文档的示例usestd::cell::OnceCell;letcell= OnceCell::new();assert!(cell.get().is_none());letvalue: &String= cell.get_or_init(|| {"Hello, World!".to_string() });assert_eq!(value,"Hello, World!");assert!(cell.get().is_some()); ...
usestd::cell::OnceCell;letcell = OnceCell::new();assert!(cell.get().is_none());letvalue:&String = cell.get_or_init(|| {"Hello, World!".to_string() });assert_eq!(value,"Hello, World!");assert!(cell.get().is_some()); ...
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::read_to_string(&self.config_path) ...
【Rust每周一库】once_cell - 最多初始化一次的cell once_cell提供了unsync::OnceCell和sync::OnceCell这两种Cell(字面意思,前者用于单线程,后者用于多线程),用来存储堆上的信息,并且具有最多只能赋值一次的特性。API大概是: 代码语言:javascript 代码运行次数:0...
[feature(once_cell)]usestd::lazy::OnceCell;letcell=OnceCell::new();assert!(cell.get().is_none());letvalue:&String=cell.get_or_init(||{"Hello, World!".to_string() });assert_eq!(value,"Hello, World!");assert!(cell.get().is_some());...
我的建议是:在普通的static中使用OnceLock。正如我在评论中所写的,它可能会更快。但是如果你真的需要...