常用Trait
1. #[derive(Debug)]
- 作用:让一个类型可以使用 {:?} 在 println! 中打印调试信息。
- 使用场景:调试阶段快速查看结构体、枚举的内部状态。
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
fn main() {
let p = Point { x: 10, y: 20 };
println!("{:?}", p); // 输出:Point { x: 10, y: 20 }
}
2. Display trait
- 作用:用于用户可读的输出({}),而不是调试输出。
- 可以自定义输出,但需要手动实现fmt方法。
use std::fmt;
struct Point {
x: i32,
y: i32,
}
impl fmt::Display for Point {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Point({}, {})", self.x, self.y)
}
}
fn main() {
let p = Point { x: 10, y: 20 };
println!("{}", p); // 输出:Point(10, 20)
}
3. From 和 Into trait
- 如果U实现了From<T>,表明U可以通过一个T类型的值转换而来。此时T自动实现了Into<U>(同样表明T可以转换为U)
- 在T上使用into方法时,需要指明要转化的类型(毕竟可能有很多不同的类型都实现了From<T>)
use std::convert::From;
#[derive(Debug)]
struct Number {
value: i32,
}
// Number 实现 From<i32>
impl From<i32> for Number {
fn from(value: i32) -> Self {
Number { value }
}
}
fn test_from_into() {
// 使用 From
let num = Number::from(12);
println!("num = {:?}", num);
// i32 自动实现了 Into<Number>
let number: i32 = 30;
// 必须指定目标类型
let new_num: Number = number.into();
let another_num: Number = 23i32.into();
println!("new_num = {:?}", new_num);
println!("another_num = {:?}", another_num);
}