書式付き出力
出力は、std::fmt で定義されている一連の macros によって 処理されます。その一部は次のとおりです:
format!: 書式付きテキストをStringに書き込むprint!:format!と同じですが、テキストはコンソール (io::stdout) に出力されます。println!:print!と同じですが、改行が追加されます。eprint!:print!と同じですが、テキストは標準エラー (io::stderr) に出力されます。eprintln!:eprint!と同じですが、改行が追加されます。
これらはすべて同じ方法でテキストを解析します。さらに、Rust は書式指定の 正しさをコンパイル時にチェックします。
fn main() { // 一般に、`{}` は任意の引数で自動的に置き換えられます。 // これらは文字列化されます。 println!("{} days", 31); // 位置引数を使用できます。`{}` の内側に整数を指定すると、 // どの追加引数に置き換えられるかが決まります。引数は // フォーマット文字列の直後の 0 から始まります。 println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob"); // 名前付き引数も使用できます。 println!("{subject} {verb} {object}", object="the lazy dog", subject="the quick brown fox", verb="jumps over"); // `:` の後にフォーマット文字を指定することで、別のフォーマットを // 呼び出せます。 println!("Base 10: {}", 69420); // 69420 println!("Base 2 (binary): {:b}", 69420); // 10000111100101100 println!("Base 8 (octal): {:o}", 69420); // 207454 println!("Base 16 (hexadecimal): {:x}", 69420); // 10f2c // 指定した幅でテキストを右寄せできます。これは // " 1" を出力します。(合計幅 5 のうち、4 つの空白と "1" です。) println!("{number:>5}", number=1); // 数値に余分なゼロを埋められます。 println!("{number:0>5}", number=1); // 00001 // また、記号を反転することで左寄せできます。これは "10000" を出力します。 println!("{number:0<5}", number=1); // 10000 // フォーマット指定子で名前付き引数を使用するには、`$` を付加します。 println!("{number:0>width$}", number=1, width=5); // Rust は、正しい数の引数が使われているかどうかさえチェックします。 println!("My name is {0}, {1} {0}", "Bond"); // FIXME ^ 不足している引数を追加してください: "James" // fmt::Display を実装している型のみが `{}` でフォーマットできます。ユーザー定義の // 型はデフォルトでは fmt::Display を実装していません。 #[allow(dead_code)] // 未使用の項目に警告する `dead_code` を無効化 struct Structure(i32); // これは `Structure` が fmt::Display を実装していないため // コンパイルされません。 // println!("This struct `{}` won't print...", Structure(3)); // TODO ^ この行のコメントを外してみてください // Rust 1.58 以降では、周囲の変数から引数を直接キャプチャできます。 // 上記と同様に、これは " 1"、つまり 4 つの空白と "1" を // 出力します。 let number: f64 = 1.0; let width: usize = 5; println!("{number:>width$}"); }
std::fmt には、テキストの表示を制御する多くの traits が 含まれています。重要なものを 2 つ、その基本形を以下に示します:
fmt::Debug:{:?}マーカーを使用します。デバッグ目的でテキストをフォーマットします。fmt::Display:{}マーカーを使用します。テキストをより洗練された、ユーザーに わかりやすい形式でフォーマットします。
ここでは、標準ライブラリがこれらの型に対する実装を提供しているため、 fmt::Display を使用しました。カスタム型のテキストを出力するには、さらに手順が必要です。
fmt::Display トレイトを実装すると、型を String に変換できる ToString トレイトも自動的に実装されます。
43 行目 では、#[allow(dead_code)] はその後の項目にのみ適用される属性です。
演習
- 上記のコードの問題(FIXME を参照)を修正し、エラーなしで 実行されるようにしてください。
Structure構造体をフォーマットしようとしている行のコメントを外してみてください (TODO を参照)- 表示される小数点以下の桁数を制御して、
Pi is roughly 3.142を出力するprintln!マクロ呼び出しを追加してください。この演習では、pi の推定値としてlet pi = 3.141592を使用してください。(ヒント: 表示する小数点以下の桁数を設定するには、std::fmtドキュメントを確認する必要があるかもしれません)