Rust {:?} vs {} 知多少

Rust {:?} vs {} 知多少

{} 指示符

{} 需要实现std::fmt::Display

{:?} 指示符

{:?} 需要实现std::fmt::Debug

案例展示

struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!("rect1 is {}", rect1);
}

编译报错:

error[E0277]: `Rectangle` doesn't implement `std::fmt::Display`

提示我们没有实现Display trait


改成如下代码:

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!("rect1 is {:?}", rect1);
}

编译报错:

error[E0277]: `Rectangle` doesn't implement `Debug`

提示没有实现Debug trait


通过上面报错提示,我们在实现struct时候要根据自己的需要来实现Display或者Debug Trait。

自定义实现Display trait

use std::fmt;
struct Rectangle {
    width: u32,
    height: u32,
}
impl fmt::Display for Rectangle{
    // This trait requires `fmt` with this exact signature.
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        // Write strictly the first element into the supplied output
        // stream: `f`. Returns `fmt::Result` which indicates whether the
        // operation succeeded or failed. Note that `write!` uses syntax which
        // is very similar to `println!`.
        write!(f, "{} {}", self.width,self.height)
    }
}
fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!("rect1 is {}", rect1);
}

输出如下:

rect1 is 30 50

Debug Trait

#[derive(Debug)]
struct Person {
    name: String,
    age: u32,
}

fn main() {
    let person = Person {
        name: String::from("Alice"),
        age: 30,
    };
    println!("Person: {:?}", person);
    println!("Person: {:#?}", person);
}

输出如下:

Person: Person { name: "Alice", age: 30 }
Person: Person {
    name: "Alice",
    age: 30,
}

一般我们可以通过#[derive(Debug)] 在编译阶段,编译器帮忙我们自动实现Debug trait。

总结

本文通过一些实例介绍了{:?} vs {} 的区别,以及实现Display和Debug Trait

你可能感兴趣的:(rust,rust,开发语言,后端)