用途:这是一份 Rust 类型驱动设计(type-driven design)的解决方案模式集合,目标是把领域约束编码进类型,让非法状态在编译期就无法表示,从而减少运行时校验与类型混淆。
主要能力与模式:
- Newtype 模式:用 struct UserId(u64)、struct OrderId(u64) 区分语义不同但底层表示相同的值,避免把用户 ID 传给订单函数这类编译通过但逻辑错误的调用。
- 类型状态模式:用 Disconnected、Connecting、Connected 等标记类型配合 PhantomData,把状态机编码进类型,只有 Connection<Connected> 才能调用 send,未连接时调用会编译失败。
- PhantomData:标记所有权与型变,例如 PhantomData<&'a T> 告知编译器存在对 T 的借用与生命周期 'a。
- 带类型状态的构建器:用 HostSet/HostUnset、PortSet/PortUnset 等类型参数,使 build() 只在必填字段都设置后才可用。
- 构造期校验:如 Email::new 返回 Result,校验一次后 Email 类型始终有效,后续函数无需重复校验。
- 标记 trait 与密封 trait:用 trait Sendable: Send + 'static 表达能力;用私有 sealed::Sealed 父 trait 阻止外部实现。
- 零大小类型(ZST):用 DebugOnly、Always 等标记类型区分行为,运行时开销为零。
使用方式:按工作流先识别领域不变量(ID 混淆、非法状态转换、本应必填的 Option、需校验的值),再选择对应模式,最后在构造时完成校验。文中给出 cargo build --release、nm、objdump、cargo test --lib 等验证命令,用于检查类型大小与 ZST 优化。
适用场景:领域标识符、状态机、必填字段构建器、需要编译期保证的 API 设计。
限制与注意:资料未提供该技能的安装方式、收费、平台支持或效果数据;示例代码需按实际项目调整,PhantomData 的型变与所有权标记需谨慎处理,否则可能引入编译错误或错误的安全假设。相关技能包括 rust-ownership、rust-trait、rust-pattern、rust-zero-cost、rust-linear-type。