Trait fastsend::ID[][src]

pub trait ID {
    fn id(self) -> u64;
}
Expand description

ID 是 fastsend 的核心 trait,用于生成不重复的 id,其表示形式为 64 位无符号整数,可用作数据库的主键。 其生成方法会消耗自身所有权,目的是确保一个 ID 实例只生成一个 id,多次生成在某些特定场景下会造成 id 冲突 的情况,例如因为代码逻辑错误导致多次调用 id 方法(但实际上如果 ID 是 Copy 的,这种情况也很难避免)。

需要注意的是 id 生成是被定义为一定成功的,并且是一个普通方法而非异步方法,意味着: 1. ID 必须一定能转化为 u64,不允许出现失败,但允许在生成的过程中 panic(这是无法阻止的); 2. ID 生成不允许是异步任务,即不允许有外部调用依赖,例如数据库、缓存、磁盘 IO 等操作,必须连贯完成,这也从 另一个角度表明 ID 生成应该尽可能的轻量化(这是与 Serialer trait 不同的地方,Serialer 允许使用 异步任务,也允许有外部依赖)。

Required methods

一个不成熟的想法

考虑把 self 替换成 Box<Self> 来显式地表明 id 方法会消耗掉自身,并且这在 Self 是 Copy 的情况 下也同样奏效,但这里就多了一次堆分配,在特定场景可能会形成性能瓶颈。签名形如:

pub trait ID {
    fn id(self: Box<Self>) -> u64;
}

Implementors