フォーマットしてプリント
プリントはstd::fmtで定義されているいくつかのマクロによって
制御されています。そのいくつかを紹介します。
format!: フォーマットされたテキストをStringに書き込む。print!:format!と同様だが、コンソール(io::stdout)に書き込む。println!:print!と同様だが、改行が追加される。eprint!:format!と同様だが、標準エラー出力(io::stderr)に書き込む。eprintln!:eprint!と同様だが、改行が追加される。
すべてのものは、同じやり方で解析し、 コンパイル時に正しくフォーマットできるか チェックします。
fn main() { // 一般的に、`{}`が自動的に引数に変換されます。 // 自動的に文字列に変換します。 println!("{} days", 31); // {}日 // 示唆しなければ、31はi32になります。示唆を加えることで、31の型を // 変えられます。例えば31i64はi64として解釈されます。 // 引数の位置を使って、埋め込まれる場所を指定することができます。 println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob"); // {0}、こちらが{1}です。{1}、こちらが{0}です。 // 名前を付けても良いです。 println!("{subject} {verb} {object}", // 素早い茶色の狐はのろまな犬を飛び越える object="the lazy dog", subject="the quick brown fox", verb="jumps over"); // `:`の後にフォーマット型を指定すると特殊なフォーマットができます。 println!("{} of {:b} people know binary, the other half doesn't", 1, 2); // {:b}(2つ目)人に{}(1つ目)人はバイナリを知っていますが、残りの半分は知りません。 // 幅を指定して右寄せにできます。 この例は // " 1". 5 white spaces and a "1"と出力します。 println!("{number:>width$}", number=1, width=6); // 余分なゼロで数字を埋めることができます。この例は"000001"と出力します。 println!("{number:>0width$}", number=1, width=6); // Rustは指定された数の引数が使われているかもチェック // します。 println!("My name is {0}, {1} {0}", "Bond"); // 私の名前は{0}、{1} {0}です。 // FIXME ^ 足りない引数、"James"を追加してください。 // `i32`を含む`Structure`という構造体を作ります。 #[allow(dead_code)] struct Structure(i32); // しかし、この構造体のようなカスタム型はもう少し複雑です。 // これは動作しません。 println!("This struct `{}` won't print...", Structure(3)); // この構造体`{}`は出力できません... // FIXME ^ この行をコメントアウトしてください。 }
std::fmtはテキストを出力するための多くのトレイトを持って
います。2つの重要なものを挙げます。
fmt::Debug:{:?}マーカーを使います。デバッグ用にテキストをフォーマットします。fmt::Display:{}マーカーを使います。もっと美しく、ユーザーフレンドリーに 表示します。
この例で使われている型は、標準ライブラリに含まれているため、ここではfmt::Display
を使用しています。カスタム型を扱う場合はもう少し複雑です。
fmt::Displayトレイトを実装すると、自動的にStringに変換する
ToStringトレイトが実装されます。
演習
- 上のコードの、2つの箇所を変更して(FIXMEを見てください)エラーなく実行できる ようにしてください。
- 表示される小数の桁数を調整し、
Pi is roughly 3.142(Piは大体3.142です) と出力されるprintln!マクロを追加してください。ただし、円周率の値はlet pi = 3.141592を使ってください。(ヒント: 小数の桁数を調整して出力 する方法について、std::fmtドキュメントをチェックしてみてください。)