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));
}
为外部类型实现外部 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);
}
零成本抽象
struct UserId(u64);
struct OrderId(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());
}
小结
| 用途 | 说明 |
|---|
| 类型安全 | 防止混淆相同底层类型 |
| 封装 | 为外部类型实现外部 trait |
| 零成本 | 编译后擦除,无运行时开销 |
| 验证 | 在构造时添加约束 |