searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Trait: Debug, Display, From, Into

2025-11-26 09:46:08
1
0

常用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);
}
  • 使用场景:
    // 函数泛型参数:
    fn takes_number(n: impl Into<Number>) {
      let n = n.into(); // 可以接受 i32 或 Number
      println!("{:?}", n);
    }
    
    takes_number(5);         // i32 自动转换为 Number
    takes_number(Number { value: 10 });
    
0条评论
作者已关闭评论
陈****然
12文章数
0粉丝数
陈****然
12 文章 | 0 粉丝
陈****然
12文章数
0粉丝数
陈****然
12 文章 | 0 粉丝
原创

Trait: Debug, Display, From, Into

2025-11-26 09:46:08
1
0

常用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);
}
  • 使用场景:
    // 函数泛型参数:
    fn takes_number(n: impl Into<Number>) {
      let n = n.into(); // 可以接受 i32 或 Number
      println!("{:?}", n);
    }
    
    takes_number(5);         // i32 自动转换为 Number
    takes_number(Number { value: 10 });
    
文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0