You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 02:09:00