65·进阶特性进阶

Newtype 模式

Newtype 模式

学习目标

  1. 理解 Newtype 模式的作用
  2. 掌握零成本抽象
  3. 实现类型安全的包装

核心概念

基本 Newtype

// 为现有类型创建新类型,增加类型安全
struct Meters(f64);
struct Seconds(f64);

fn speed(distance: Meters, time: Seconds) -> f64 {
    distance.0 / time.0
}

fn main() {
    let d = Meters(100.0);
    let t = Seconds(9.58);
    println!("速度: {:.2} m/s", speed(d, t));

    // speed(t, d);  // ❌ 类型不匹配
}

为外部类型实现外部 trait

struct Wrapper(Vec<String>);

impl std::fmt::Display for Wrapper {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "[{}]", self.0.join(", "))
    }
}

fn main() {
    let w = Wrapper(vec!["hello".to_string(), "world".to_string()]);
    println!("{}", w);
}

零成本抽象

// Newtype 在编译后被完全擦除,没有运行时开销
struct UserId(u64);
struct OrderId(u64);

// 两个 ID 在运行时都是 u64,但编译器防止混用

实现 Deref

use std::ops::Deref;

struct SafeString(String);

impl SafeString {
    fn new(s: &str) -> Self {
        // 可以在这里添加验证
        SafeString(s.to_string())
    }
}

impl Deref for SafeString {
    type Target = str;
    fn deref(&self) -> &str {
        &self.0
    }
}

fn main() {
    let s = SafeString::new("hello");
    println!("len: {}", s.len());  // 通过 Deref 调用 str 方法
}

小结

用途说明
类型安全防止混淆相同底层类型
封装为外部类型实现外部 trait
零成本编译后擦除,无运行时开销
验证在构造时添加约束

练习编辑器

rust
Loading...