2个版本 (1个稳定版)
1.0.0 | 2024年3月13日 |
---|---|
0.2.2 | 2020年7月9日 |
#149 在 内存管理
322 每月下载量
在 2 个crate中使用(通过 kontroli)
9KB
98 行
lazy-st
这个crate为Rust提供单线程延迟评估。它是lazy crate的修改版本,移除了对多线程操作的支持,增加了对no_std
环境的支持,并使其与较新的Rust版本兼容。
要在线程间共享延迟值,请考虑使用lazy-mt crate。
示例
fn expensive() -> i32 {
println!("I am only evaluated once!"); 7
}
fn main() {
let a = lazy!(expensive());
// Thunks are just smart pointers!
assert_eq!(*a, 7); // "I am only evaluated once!" is printed here
let b = [*a, *a]; // Nothing is printed.
assert_eq!(b, [7, 7]);
}
lib.rs
:
单线程延迟评估。
延迟评估允许你定义仅在真正需要时才进行评估的计算。这也可以通过闭包实现;然而,在延迟评估的情况下,计算的结果只计算一次并存储在缓存中。
如果你在运行时可能需要多次使用昂贵的计算结果,但事先不知道是否真的需要它,那么延迟评估很有用。
让我们考虑一个示例,我们首先使用闭包来延迟评估
fn expensive() -> i32 {
println!("I am expensive to evaluate!"); 7
}
fn main() {
let a = || expensive(); // Nothing is printed.
assert_eq!(a(), 7); // "I am expensive to evaluate!" is printed here
let b = [a(), a()]; // "I am expensive to evaluate!" is printed twice
assert_eq!(b, [7, 7]);
}
与使用延迟评估进行对比
fn expensive() -> i32 {
println!("I am expensive to evaluate!"); 7
}
fn main() {
let a = lazy!(expensive()); // Nothing is printed.
// Thunks are just smart pointers!
assert_eq!(*a, 7); // "I am expensive to evaluate!" is printed here
let b = [*a, *a]; // Nothing is printed.
assert_eq!(b, [7, 7]);
}
此crate中的延迟值不能在线程间共享。如果需要这样做,请考虑使用lazy-mt
crate。