#资源 #类型 #模拟 #属性 #手动 #特质 #丢弃

无 std 相关

一个小型实用类型,用于模拟必须使用类型

7 个不稳定版本 (3 个破坏性更新)

使用旧 Rust 2015

0.4.2 2019年5月23日
0.4.1 2019年4月1日
0.4.0 2019年1月22日
0.3.0 2018年12月1日
0.1.1 2018年1月26日

#2527 in Rust 模式

Download history 381/week @ 2024-03-13 687/week @ 2024-03-20 633/week @ 2024-03-27 680/week @ 2024-04-03 577/week @ 2024-04-10 576/week @ 2024-04-17 554/week @ 2024-04-24 489/week @ 2024-05-01 479/week @ 2024-05-08 517/week @ 2024-05-15 574/week @ 2024-05-22 673/week @ 2024-05-29 541/week @ 2024-06-05 412/week @ 2024-06-12 476/week @ 2024-06-19 481/week @ 2024-06-26

每月下载量:2,002
58 个crate中使用(直接使用9个)

MIT/Apache

7KB
60

相关

一个小型实用类型,用于模拟必须使用类型。它们与 #[must_use] 属性不同,拥有实例的用户必须将其发送到别处或手动 dispose 它。

这适用于需要手动销毁但无法通过 Drop 特质实现的类型。例如,从某些源创建的资源处理器,并且必须将其返回到同一源。

用法

Relevant 类型是不可丢弃的。由于当前实现的限制,当它被丢弃时会引发恐慌。为了使类型不可丢弃,它必须包含不可丢弃的类型(例如 Relevant 类型)。

示例


struct SourceOfFoos {
    handle: u64,
}

/// Foo must be destroyed manually.
struct Foo {
   handle: u64,
   relevant: Relevant,
}

/// Function from C library to create `Foo`
/// Access to same source must be synchronized.
extern "C" create_foo(source: u64) -> u64;

/// Function from C library to destroy `Foo`.
/// Access to same source must be synchronized.
extern "C" destroy_foo(source: u64, foo: u64) -> u64;

impl SourceOfFoos {
    fn create_foo(&mut self) -> Foo {
        Foo {
            handle: create_foo(self.handle),
            relevant: Relevant,
        }
    }

    fn destroy_foo(&mut self, foo: Foo) {
        destroy_foo(self.handle, foo.handle);
        foo.relevant.dispose();
    }
}

现在不可能意外丢弃 Foo 并泄漏句柄。当然,总是可以显式地使用 std::mem::forget 相关类型。但这将是故意的泄露。

依赖项

~8–740KB
~15K SLoC