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