【问题标题】:How to print structs and arrays?如何打印结构和数组?
【发布时间】:2015-05-15 07:00:38
【问题描述】:

Go 似乎可以直接打印结构和数组。

struct MyStruct {
    a: i32,
    b: i32
}

let arr: [i32; 10] = [1; 10];

【问题讨论】:

  • Rust 的理念与 Go 不同:Go 是“包括电池”,Rust 是“不为不使用的东西付费”。因此,如果您想打印MyStruct,您必须要求编译器包含打印它的代码(或自己编写代码)。
  • @MatthieuM。这实际上是正确的答案(与 Go 相关的背景很好)。发布,我会投票。

标签: rust


【解决方案1】:

你想在你的结构体上实现Debug trait。使用#[derive(Debug)] 是最简单的解决方案。然后就可以用{:?}打印了:

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

fn main() {
    let x = MyStruct{ a: 10, b: 20 };
    println!("{:?}", x);
}

【讨论】:

  • 我们可以对数组使用 Debug trait 吗?
  • @tez Debug trait 是 already implemented for many types,包括从 0 到 32 项的数组,以及任意长度的切片和 Vec。重要的是容器内的item也必须实现Debug.
  • 也可以在调试模式下使用与上述答案相同的特征#[derive(Debug)] 进行漂亮打印,同时在println! 宏中将{:?} 替换为{:#?}。详情可见Rust Book Ch-5
【解决方案2】:

作为mdup says,你可以使用Debug,但你也可以使用Display trait。

所有类型都可以将fmt::Debug 实现派生(自动创建)为#[derive(Debug)],但fmt::Display 必须手动实现。

您可以创建自定义输出:

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);    
}

壳牌:

Used Display: (value a: 0, value b: 0)

更多信息可以关注fmt module documentation

【讨论】:

    【解决方案3】:

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

    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]`
    

    可以使用此答案中的方法打印出更长的数组:Implement Debug trait for large array type

    【讨论】:

      【解决方案4】:

      其实{:?}就够了。

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

      【讨论】:

      • 这不适用于结构。它仅适用于数组。
      • 它只适用于内部元素实现Debug trait的数组。
      【解决方案5】:
      #[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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-17
        • 2016-11-21
        • 2015-08-14
        • 1970-01-01
        • 2012-08-17
        • 2020-05-06
        相关资源
        最近更新 更多