Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

書式付き出力

出力は、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 ドキュメントを確認する必要があるかもしれません)

関連項目:

std::fmt, macros, struct, traits、および dead_code