7 个版本 (4 个破坏性版本)

0.5.0 2023 年 7 月 31 日
0.4.0 2021 年 11 月 12 日
0.3.1 2021 年 7 月 3 日
0.2.1 2020 年 10 月 20 日
0.1.0 2020 年 6 月 20 日

#536Rust 模式

Download history 3401/week @ 2024-03-14 3074/week @ 2024-03-21 4286/week @ 2024-03-28 6507/week @ 2024-04-04 9028/week @ 2024-04-11 5646/week @ 2024-04-18 5107/week @ 2024-04-25 7867/week @ 2024-05-02 5645/week @ 2024-05-09 5332/week @ 2024-05-16 9050/week @ 2024-05-23 7207/week @ 2024-05-30 4702/week @ 2024-06-06 7967/week @ 2024-06-13 5877/week @ 2024-06-20 18663/week @ 2024-06-27

每月 38,343 次下载
用于 5 个 crate (4 个直接使用)

MIT/Apache

19KB
211

一个小型 crate,用于处理必须在生命周期结束时消费的资源。

由于 Rust 的类型系统是偏线性的而不是线性的,Drop::drop 会以可变借用形式借用 self,而不是消费它。在大多数情况下,这是可以的,但是对于某些情况(例如,与 crate gfx_hal 一起工作)资源必须在 drop 时消费。这个 crate 和 dispose_derive crate 通过为你管理 ManuallyDrop 包装器来覆盖此类情况的典型样板代码。有关更多信息,请参阅 Dispose derive 宏。

作为额外的好处,这个 crate 使将 FnOnce 闭包的执行推迟到作用域末尾变得很容易,这可以使用 defer 函数来完成。

注意: Dispose 特性本身并不提供 Drop 实现。为此,实现 Dispose 的值必须包裹在 Disposable 结构体中。

示例

use dispose::{Dispose, Disposable};

struct MyStruct;

impl Dispose for MyStruct {
    fn dispose(self) { println!("Goodbye, world!"); }
}

{
    let _my_struct = Disposable::new(MyStruct);
} // prints "Goodbye, world!"

作为一个设计考虑,实现 Dispose 的值应该 始终 返回包裹在 Disposable 或任何其他正确实现 Drop 的包装器中。建议使用 Disposable,因为它包含一个不安全的 leak 函数来检索内部值,如果需要的话。

use dispose::{Dispose, Disposable};

mod secrets {

    pub struct Secrets {
        launch_codes: u32,
    }

    impl Secrets {
        pub fn new(launch_codes: u32) -> Disposable<Self> {
            Self { launch_codes }.into()
        }
    }

    impl Dispose for Secrets {
        fn dispose(mut self) { self.launch_codes = 0x0; } // Nice try, hackers!
    }
}

fn main() {
    let secret = secrets::Secrets::new(0xDEADBEEF);
} // secret is properly disposed at the end of the scope

fn BAD() {
    let secret = secrets::Secrets::new(0o1337);

    let mwahaha = unsafe { Disposable::leak(secret) };
} // .dispose() was not called - data has been leaked!

(我的律师建议我注意,上面的示例不是加密安全的。请勿通过将其设置为零来清理安全内存。)

依赖关系

~0.3–0.8MB
~19K SLoC