#lazy-evaluation #mut #static #init

lazy_mut

该包提供了一个可以用于懒加载值的结构,以及一个用于创建懒变量的宏。

1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2018年3月11日

#37#lazy

Download history 1120/week @ 2024-03-14 1313/week @ 2024-03-21 748/week @ 2024-03-28 305/week @ 2024-04-04 323/week @ 2024-04-11 546/week @ 2024-04-18 573/week @ 2024-04-25 381/week @ 2024-05-02 417/week @ 2024-05-09 282/week @ 2024-05-16 212/week @ 2024-05-23 321/week @ 2024-05-30 480/week @ 2024-06-06 249/week @ 2024-06-13 319/week @ 2024-06-20 384/week @ 2024-06-27

1,541 每月下载量
librstb 中使用

MIT 许可证

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