Rust 如何打印结构和数组?

Rust 如何打印结构和数组?,rust,Rust,Go似乎能够直接打印结构和数组 struct MyStruct { a: i32, b: i32 } 及 您希望在结构上实现Debug特性。使用#[派生(调试)]是最简单的解决方案。然后您可以使用{:?}打印它: #[derive(Debug)] struct MyStruct{ a: i32, b: i32 } fn main() { let x = MyStruct{ a: 10, b: 20 }; println!("{:?}", x);

Go似乎能够直接打印结构和数组

struct MyStruct {
    a: i32,
    b: i32
}


您希望在结构上实现
Debug
特性。使用
#[派生(调试)]
是最简单的解决方案。然后您可以使用
{:?}
打印它:

#[derive(Debug)]
struct MyStruct{
    a: i32,
    b: i32
}

fn main() {
    let x = MyStruct{ a: 10, b: 20 };
    println!("{:?}", x);
}
同样,您可以使用
Debug
,但也可以使用trait。您可以创建自定义输出:

struct MyStruct {
    a: i32,
    b: i32
}

impl std::fmt::Display for MyStruct {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "(value a: {}, value b: {})", self.a, self.b)
    }
}

fn main() {
    let test = MyStruct { a: 0, b: 0 };

    println!("Used Display: {}", test);    
}
外壳:

使用的显示:(值a:0,值b:0)

有关更多信息,您可以查看。

因为这里没有人明确回答数组,所以要打印数组,您需要指定
{:?}
,也用于打印调试输出

let val = 3;
let length = 32; // the maximum that can be printed without error
let array1d = [val; length];
let array2d = [array1d; length]; // or [[3; 32]; 32];
let array3d = [array2d; length]; // or [[[3; 32]; 32]; 32];
但是,
length>32
的数组将以错误退出:

let length = 33;
let array1d = [3; length];
println("{:?}", array1d);

error[E0277]: the trait bound `[{integer}; 33]: std::fmt::Debug` is not satisfied
--> src\main.rs:6:22
|
|     println!("{:?}", array1d);
|                      ^^^^^^^ the trait `std::fmt::Debug` is not implemented for `[{integer}; 33]`

使用下面的方法可以打印出更长的数组:

实际上只要
{:?}
就足够了

let a = [1, 2, 3, 4, 5];
let complete = &a[..];
println! ("{:?}", a);
println! ("{:?}", complete);

Rust与Go有着不同的理念:Go是“包括电池”,Rust是“不要为你不用的东西付费”。因此,如果您希望打印
MyStruct
,您必须要求编译器包含用于打印的代码(或自己编写代码)。@MatthieuM。这实际上是正确的答案(与围棋相关的背景很好)。发布后,我将向上投票。我们可以对数组使用调试特性吗?@tez
Debug
特性是,包括0到32个项目的数组,以及任意长度的切片和
Vec
。重要的是容器中的项还必须实现
Debug
。在
println中将
{:#}
替换为
{:#}
的同时,还可以使用上述答案中所示的相同特性在调试模式下漂亮地打印宏。可以在中找到详细信息。对于结构,这不是真的。它只适用于数组,并且只适用于其内部元素实现了
Debug
特性的数组。
let a = [1, 2, 3, 4, 5];
let complete = &a[..];
println! ("{:?}", a);
println! ("{:?}", complete);
#[derive(Debug)]
 struct Rectangle{
       width: u32,
       height: u32,
  }

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

   println!("The rectangle {:?} ", rec);
   println!("The area of the rectangle is {} pixels", 
   area_rectangle(&rec));
}

fn area_rectangle(rectangle: &Rectangle) -> u32{
    rectangle.width * rectangle.height
}