Rust中能否自定义强类型别名避免相同底层类型混用?
Rust 原生提供了newtype 模式可以完全满足你的需求,没有额外运行时开销,不需要额外的语法扩展,也不需要用不同数值类型的 hack 方案。
普通 type 关键字定义的只是类型同义词,编译器会将其和底层类型完全等同,不会做任何隔离检查。而 newtype 模式通过单字段元组结构体包装底层类型,编译器会将其视为完全独立的类型,混用直接抛出编译错误。
原生实现示例
你只需要把原来的类型别名改成如下定义即可:
// 两个底层都是usize,但属于完全独立的类型 #[derive(Debug, Clone, Copy, PartialEq, Eq)] struct WidgetCounter(usize); #[derive(Debug, Clone, Copy, PartialEq, Eq)] struct FoobarTally(usize);
修改后的测试代码如下:
fn tally_the_foos(tally: FoobarTally) -> FoobarTally { tally } fn main() { let wc = WidgetCounter(33); let ft = FoobarTally(1); // 此处编译直接报错,提示类型不匹配:expected struct `FoobarTally`, found struct `WidgetCounter` let tally_total = tally_the_foos(wc); }
如果需要访问底层的数值,直接取结构体的第0个字段即可:
let count: usize = wc.0;
简化实现的工具
如果需要为 newtype 实现大量底层类型的方法(比如数值运算、格式转换等),不需要手动逐个实现:
- 可以通过 Rust 标准库的 derive 宏自动实现
Debug、Clone、Copy、PartialEq等通用 trait - 也可以使用 crates.io 上的第三方 newtype 工具库,批量生成你需要的底层方法实现,避免冗余代码。
内容的提问来源于stack exchange,提问作者JamesThomasMoon
相关产品推荐
相关产品推荐

