2个版本 (1个稳定版)

1.0.0 2024年3月13日
0.2.2 2020年7月9日

#149内存管理

Download history 88/week @ 2024-04-01 17/week @ 2024-04-08 35/week @ 2024-04-15 25/week @ 2024-04-22 3/week @ 2024-04-29 15/week @ 2024-05-06 168/week @ 2024-05-13 34/week @ 2024-05-20 86/week @ 2024-05-27 80/week @ 2024-06-03 41/week @ 2024-06-10 34/week @ 2024-06-17 91/week @ 2024-06-24 68/week @ 2024-07-01 118/week @ 2024-07-08 42/week @ 2024-07-15

322 每月下载量
2 个crate中使用(通过 kontroli

MIT 许可证

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。

无运行时依赖