変数がどうなっているのかを確認する方法

println

println!で変数の内容を出力する場合、"{:?}" を使います。

println!("{:?}", [変数])

fn main() {
    let s = "ABC";
    println!("{:?}", s);  // "ABC"

    println!("{:?}", s.chars()); // Chars(['A', 'B', 'C'])

    println!("{:?}", s.chars().nth(1)); // Some('B')

    println!("{:#?}", s.chars().nth(1).unwrap()); // 'B'

    let i = 123;
    println!("{:?}", i); // 123
}

実行結果は以下のようになります。

"ABC"
Chars(['A', 'B', 'C'])
Some('B')
'B'
123

改行して出力

見やすいように改行ありで出力する場合は、"{:#?}" を指定します。

fn main() {
    let s = "ABC";

    println!("{:#?}", s.chars()); // 改行される

    println!("{:#?}", s.chars().nth(1)); // 改行される

    println!("{:#?}", s.chars().nth(1).unwrap());

    let i = 123;
    println!("{:#?}", i);
}

出力は以下になります。

"ABC"
Chars([
    'A',
    'B',
    'C',
])
Some(
    'B',
)
'B'
123

構造体(struct)

構造体の変数を表示したい場合、型定義に std::fmt::Debug のトレイトを実装する必要があります。 実装せずに表示したい場合は、定義行の上に以下を付けます。

#[derive(Debug)]

#[derive(Debug)]
struct User {
    id: u32,
    name: String,
}

fn main() {
    let user = User {
        id: 12345,
        name: String::from("山田太郎"),
    };
    println!("{:?}", user);
}

実行結果は以下になります。

User { id: 12345, name: "山田太郎" }

std::fmt::Debugの実装

std::fmt::Debug のトレイトの実装では、"use std::fmt" が必要になります。

use std::fmt;

struct User {
    id: u32,
    name: String,
}

impl fmt::Debug for User {     
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        f.debug_struct("User")
         .field("id", &self.id)
         .field("name", &self.name)
         .finish()
    }
}

fn main() {
    let user = User {
        id: 12345,
        name: String::from("山田太郎"),
    };
    println!("{:?}", user);
}

実行結果は以下になります。

User { id: 12345, name: "山田太郎" }