S-JIS[2024-10-09] 変更履歴

Rust format!マクロ

Rustマクロのformat!マクロのメモ。


概要

format!マクロは、書式に従った文字列(String)を返すマクロ
(C言語のsprintf()やJavaのString.format()のようなもの)


    let n = 123;
    let s = format!("n={}", n);
    let s = format!("n={n}");

    let m = 456;
    let s = format!("n={}, m={}", n, m);
    let s = format!("n={n}, m={m}");    

format!()の第1引数に書式入りの文字列を指定する。
第2引数以降は、書式に必要な値を指定する。

format!マクロはマクロなので、コンパイル前(プリコンパイル時)に展開される。
第2引数以降が書式に合致していないとコンパイルエラーになる。


print!系マクロもformat!マクロと同じ書式が利用できる。


format!マクロの書式

format!()の第1引数には書式入りの文字列を指定する。

format!マクロで使用できる書式の詳細はModule std::fmtを参照。

書式 説明
{} format!()の第2引数以降の値に置換する。
(to_stringメソッドを呼ぶので)値の型にはDisplayトレイトが実装されている必要がある。
{}が複数ある場合は、第2引数以降の値を順番に適用する。
let n = 123;
let s = format!("n={}", n);
assert_eq!("n=123", s);
{インデックス} {}内に数値(インデックス)を入れると、そのインデックスに当たる引数が使われる。 let s = format!("{1} {} {0} {}", 'a', 'b');
assert_eq!("b a a b", s);
{変数名} {}内に文字列(変数名)を入れると、その名前の変数の値に置換する。
第2引数以降で一時的な名前を付ける使い方と、format!()の外の変数を読む使い方がある。
let s = format!("n={n}", n = 123);
assert_eq!("n=123", s);
let n = 123;
let s = format!("n={n}");
assert_eq!("n=123", s);
{〜:書式パラメーター} {}内にコロン「:」で区切って書式パラーメーターを指定することが出来る。 let v = vec![1, 2, 3];
let s = format!("v={v:?}");
assert_eq!("v=[1, 2, 3]", s);

書式パラーメーターは、{}内にコロン「:」で区切ってコロンの後ろに指定する。

書式パラメーター(抜粋)
書式パラメーター 説明
数値 桁数を指定する。 let s = format!("{:5}", 'x');
assert_eq!("x    ", s);
変数名$ 桁数を変数で指定する。 let s = format!("{:width$}", 'x', width = 5);
assert_eq!("x    ", s);
<数値 左寄せ let s = format!("{:<5}", 'x');
assert_eq!("x    ", s);
^数値 中央揃え let s = format!("{:^5}", 'x');
assert_eq!("  x  ", s);
>数値 右寄せ let s = format!("{:>5}", 'x');
assert_eq!("    x", s);
0数値 指定された桁数での0埋め let s = format!("{:05}", 123);
assert_eq!("00123", s);
+ 符号付き let s = format!("{:+}", 123);
assert_eq!("+123", s);
? Debugトレイトによる出力 let v = vec![1, 2, 3];
let s = format!("{:?}", v);
assert_eq!("[1, 2, 3]", s);
#? Debugトレイトによる出力(pretty-print) let v = vec![1, 2, 3];
let s = format!("{:#?}", v);
assert_eq!("[
    1,
    2,
    3,
]", s);
#x
#X
十六進数
桁数を指定するときは、出力される「0x」の2桁分も考慮する必要がある。
let s = format!("{:#x}", 10);
assert_eq!("0xa", s);
let s = format!("{:#06x}", 10);
assert_eq!("0x000a", s);
#b 二進数
桁数を指定するときは、出力される「0b」の2桁分も考慮する必要がある。
let s = format!("{:#b}", 10);
assert_eq!("0b1010", s);
let s = format!("{:#010b}", 10);
assert_eq!("0b00001010", s);
#o 八進数  

マクロへ戻る / Rustへ戻る / 技術メモへ戻る
メールの送信先:ひしだま