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 日 |
#536 在 Rust 模式
每月 38,343 次下载
用于 5 个 crate (4 个直接使用)
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