Newtype 模式
学习目标
- 理解 Newtype 模式的作用
- 掌握零成本抽象
- 实现类型安全的包装
核心概念
基本 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...