Как печатать структуры и массивы?

Go, похоже, может печатать структуры и массивы напрямую.

struct MyStruct {
    a: i32,
    b: i32
}

и

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

Ответы

Ответ 1

Вы хотите реализовать черту Debug в своей структуре. Использование #[derive(Debug)] - самое простое решение. Затем вы можете распечатать его с помощью {:?}:

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

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

Ответ 2

Как говорит mdup, вы можете использовать Debug, но вы также можете использовать черту 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.

Ответ 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]'

Более длинные массивы могут быть распечатаны с подходом из этого ответа: Реализация отладочной черты для большого типа массива

Ответ 4

На самом деле просто {:?} Достаточно.

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