1 个不稳定版本
使用旧的 Rust 2015
0.1.0 | 2018年3月11日 |
---|
#37 在 #lazy 中
1,541 每月下载量
在 librstb 中使用
9KB
122 行
lazy_mut
lib.rs
:
该包提供了一个可以用于懒加载值的结构,以及一个用于创建懒变量的宏。
LazyMut<T>
解引用到 T
,但是如果在它初始化之前进行不可变解引用,它将抛出错误。允许可变解引用,并且会自动初始化变量,以便进行如 *VEC = vec![1, 2, 3]
的赋值,在未初始化的 VEC
上。即使不必要,也应包括显式初始化以提高可读性。
局部变量
使用 lazy_mut
宏可以使声明懒变量更加容易
#[macro_use]
extern crate lazy_mut;
lazy_mut! {
let mut num: u32 = 2 + 3;
}
num.init();
assert_eq!(*num, 5);
另一种,更长的写法将是
use lazy_mut::LazyMut;
let mut num = {
fn init() -> u32 { 2 + 3 }
LazyMut::Init(init)
};
num.init();
assert_eq!(*num, 5);
函数定义使这段代码比宏的示例更难以阅读和理解。然而,这段代码确实强调了变量是懒的,在使用之前必须进行初始化。在选择如何使用 LazyMut
时,应考虑这种权衡。
静态变量
lazy_mut
宏也适用于静态变量
#[macro_use]
extern crate lazy_mut;
lazy_mut! {
static mut VEC: Vec<u64> = Vec::new();
}
VEC.init(); // Although technically unnecessary, it is more clear to explicitly initialize it
VEC.push(17);
VEC.push(64);
assert_eq!(*VEC, vec![17, 64]);
另一种写法将是
use lazy_mut::LazyMut;
static mut VEC: LazyMut<Vec<u64>> = LazyMut::Init(Vec::new);
VEC.push(17);
VEC.push(64);
assert_eq!(*VEC, vec![17, 64]);
请注意,使用直接定义时,可以将 Vec::new
函数直接传递,这使得编写更加简单。 LazyMut
可以用于为在运行时需要堆分配的类型创建简单的初始化器,例如集合、字符串或装箱类型。
依赖项
~43KB