Rust 核心 Trait 详解
1. Drop
• 作用: 自定义值离开作用域时的清理逻辑
• Trait 定义:
pub trait Drop {fn drop(&mut self);
}
• 关键点:
• 自动调用,无法手动触发(可用 std::mem::drop
强制提前释放)
• 用于释放资源(如文件句柄、网络连接)
• 实现了 Drop
的类型不能实现 Copy
• 示例:
struct Resource;
impl Drop for Resource {fn drop(&mut self) { println!("资源释放!"); }
}
2. Sized
• 作用: 标记类型在编译期已知大小
• Trait 特性:
• 隐式自动实现(如 i32
, struct
)
• 未实现类型:[T]
(切片)、str
、dyn Trait
• 特殊用法:
fn generic<T: ?Sized>(t: &T) {} // 允许接受未定长类型
3. Clone
vs Copy
Trait | 区别 | 使用场景 | 示例 |
---|---|---|---|
Clone |
显式深拷贝 (x.clone() ) |
需资源复制的复杂类型 | String , Vec<T> |
Copy |
隐式位复制(自动复制) | 简单值类型 | i32 , f64 , 元组(全 Copy) |
• 代码示例:
#[derive(Clone, Copy)]
struct Point { x: i32, y: i32 } // 必须同时实现 Clone
4. Deref
/ DerefMut
• 作用: 重载解引用操作符 *
和 .
• Trait 定义:
pub trait Deref {type Target: ?Sized;fn deref(&self) -> &Self::Target;
}
• 关键机制:
• Deref Coercion:自动转换链(如 &Box<String>
→ &String
→ &str
)
• 常用于智能指针(Box<T>
, Rc<T>
)
• 示例:
struct MyBox<T>(T);
impl<T> Deref for MyBox<T> {type Target = T;fn deref(&self) -> &T { &self.0 }
}
5. Default
• 作用: 提供类型的默认值
• Trait 方法:
pub trait Default {fn default() -> Self;
}
• 实用场景:
• 结构体更新语法:Config { timeout: 5, ..Default::default() }
• 泛型约束中初始化类型
• 可派生:
#[derive(Default)]
struct Config { timeout: u32 }
6. 引用转换 Trait
Trait | 作用 | 方法 | 典型实现 |
---|---|---|---|
AsRef<T> |
不可变引用转换 | as_ref() |
String → &str |
AsMut<T> |
可变引用转换 | as_mut() |
Vec<T> → &mut [T] |
Borrow<T> |
借用语义等价转换 | borrow() |
String → &str |
BorrowMut<T> |
可变借用语义等价转换 | borrow_mut() |
Vec<T> → &mut [T] |
• 关键区别:
• Borrow
要求哈希/比较行为与原类型一致
• AsRef
用于通用引用转换,无行为一致性要求
7. 类型转换 Trait
(1) 无错误转换
Trait | 方向 | 方法 | 示例 |
---|---|---|---|
From<T> |
T → Self | from() |
String::from("hi") |
Into<T> |
Self → T | into() |
let s: String = "hi".into(); |
(2) 可能失败的转换
Trait | 错误处理 | 方法 | 典型场景 |
---|---|---|---|
TryFrom<T> |
返回 Result | try_from() |
数值类型窄化转换 |
TryInto<T> |
返回 Result | try_into() |
字符串解析为数字 |
• 关系:
• Into
自动实现当 From
存在时
• TryInto
自动实现当 TryFrom
存在时
8. ToOwned
• 作用: 从借用数据创建拥有所有权的副本(泛化的 Clone
)
• Trait 定义:
pub trait ToOwned {type Owned: Borrow<Self>;fn to_owned(&self) -> Self::Owned;
}
• 与 Clone
区别:
• Clone
直接返回 Self
,ToOwned
可返回不同但能 Borrow<Self>
的类型
• 经典案例:
let s: &str = "hello";
let owned: String = s.to_owned(); // &str → String
核心 Trait 总结表
Trait | 主要作用 | 关键方法/机制 |
---|---|---|
Drop |
资源清理 | 自动调用 drop() |
Sized |
标记编译期已知大小 | 隐式实现 |
Clone /Copy |
复制语义 | clone() / 隐式复制 |
Deref /Mut |
重载解引用操作符 | Deref Coercion 机制 |
Default |
默认值初始化 | default() |
AsRef /Mut |
通用引用转换 | as_ref() , as_mut() |
Borrow /Mut |
语义等价借用 | HashMap 的键查找 |
From /Into |
无错误类型转换 | from() , into() |
TryFrom /Into |
可能失败的类型转换 | try_from() , try_into() |
ToOwned |
创建所有权副本 | to_owned() |