#object #id #drop

object-id

无生成器的唯一对象 ID

5 个版本

0.1.4 2024 年 3 月 3 日
0.1.3 2024 年 3 月 3 日
0.1.2 2024 年 3 月 3 日
0.1.1 2024 年 3 月 3 日
0.1.0 2024 年 3 月 3 日

#14#drop

Download history 219/week @ 2024-04-04 187/week @ 2024-04-11 995/week @ 2024-04-18 851/week @ 2024-04-25 632/week @ 2024-05-02 991/week @ 2024-05-09 210/week @ 2024-05-16 45/week @ 2024-05-23 81/week @ 2024-05-30 120/week @ 2024-06-06 164/week @ 2024-06-13 93/week @ 2024-06-20 65/week @ 2024-06-27 150/week @ 2024-07-04 167/week @ 2024-07-11 87/week @ 2024-07-18

479 每月下载量
用于 12 个crate (3 直接)

MIT 许可证

7KB
119

object-id

Rust 唯一对象 ID

一个简单的对象,保证对象 ID 在被丢弃之前是唯一的。

工作原理

UniqueId 对象本身不生成任何 ID,而是分配堆中的一个字节。该字节的指针可以用来标识对象本身以及任何持有该 ID 的其他对象。

为何有用

唯一对象 ID 通常用于 (通常由 Drop) 通知各种第三方对象源被丢弃,例如必须取消订阅事件、从集合、映射等中删除。

克隆

请注意,当克隆 UniqueId 对象或父对象时,ID 会改变。

其他特质

UniqueId 实现了父对象可能需要的多数特质。

如何使用

由于 UniqueId 对象在克隆时发生变化,无论单独还是与父对象一起,目标集合应保留/比较其数值表示形式。示例

use object_id::UniqueId;
use once_cell::sync::Lazy;
use std::sync::mpsc::{self, Sender, Receiver};
use std::sync::Mutex;

static EVENT_RECEIVERS: Lazy<Mutex<Vec<(usize, Sender<()>)>>> = Lazy::new(<_>::default);

struct Client {
    id: UniqueId,
    rx: Receiver<()>
}

impl Drop for Client {
    fn drop(&mut self) {
        EVENT_RECEIVERS.lock().unwrap().retain(|(id, _)| *id != self.id.as_usize());
    }
}

{
    let (tx, rx) = mpsc::channel();
    let client = Client { id: <_>::default(), rx };
    EVENT_RECEIVERS.lock().unwrap().push((client.id.as_usize(), tx));
} // the client is dropped here
assert!(EVENT_RECEIVERS.lock().unwrap().is_empty());

可以使用类似的方法存储对象的异步 Waker 与其唯一 ID,以便通知生产者在数据消费之前对象 Future 被丢弃,并妥善处理中断。

无运行时依赖