// dictionary
コンソール出力.
Rustでコンソールに文字を表示するには、println!マクロを使います。渡した文字列を標準出力(stdout)に表示し、末尾に改行を加えます。改行したくない場合はprint!を使います。名前が!で終わることから分かるとおり、これらは関数ではなくマクロです。
文字列中の{}はプレースホルダで、後ろに並べた式の値が順に埋め込まれます。{name}のように変数名を直接書いてキャプチャすることもできます(Rust 1.58で安定化。書けるのは変数名だけで、{item.price}のような式は書けません)。
fn main() {
let item = "りんご";
let price = 120;
println!("{}を{}個買います", item, 3); // 値を順に埋め込む
println!("単価は{price}円です"); // 変数名を直接埋め込む
print!("改行");
print!("しない");
println!();
}Playgroundで開く出力マクロの種類
| マクロ | 出力先 | 改行 |
|---|---|---|
println! / print! |
標準出力(stdout) | あり / なし |
eprintln! / eprint! |
標準エラー出力(stderr) | あり / なし |
同じ書式で、出力せずに文字列型を組み立てるformat!もあります。エラーメッセージや進捗表示には、通常の出力と分離できるeprintln!が推奨されています。
フォーマット指定
{}の中に:に続けて書式を指定できます。よく使うものを挙げます。
| 書き方 | 意味 | 例 → 出力 |
|---|---|---|
{} |
人向けの表示(Display) |
"あ" → あ |
{:?} |
デバッグ表示(Debug。クオート付き) |
"あ" → "あ" |
{:#?} |
デバッグ表示の整形版 | 構造体 → 1フィールド1行の複数行で表示 |
{:.2} |
小数点以下2桁(丸め) | 3.14159 → 3.14 |
{:>8} |
幅8で右寄せ(<は左寄せ) |
42 → 42 |
{:04} |
0埋めで幅4 | 42 → 0042 |
{そのものを表示したいときは{{と重ねてエスケープします。
補足
構造体や列挙型などの独自型をデバッグ表示する(derive Debug)
自作の構造体や列挙型は、そのままでは{:?}でも表示できません。定義に#[derive(Debug)]を付けると、デバッグ表示の実装が自動生成されます。なお、この自動生成される出力の形式は将来のRustで変わる可能性があるため、形式に依存した処理を書くのは避けます(std公式ドキュメント, Debug)。
#[derive(Debug)]
struct Item {
name: String,
price: u32,
}
fn main() {
let item = Item { name: String::from("りんご"), price: 120 };
println!("{:?}", item); // Item { name: "りんご", price: 120 }
println!("{:#?}", item); // 1フィールド1行で整形表示
}Playgroundで開く出力が表示されないときとループ内の性能
print!で改行なしの出力をした直後は、バッファリングにより画面に表示されないことがあります。すぐに表示したい場合はstd::io::Writeをインポートしてstd::io::stdout().flush()を呼びます(std公式ドキュメント, print!)。
またprintln!は呼び出しごとに標準出力のロックを取得するため、大量に出力するループでは遅くなります。std::io::stdout().lock()で一度ロックを取り、writeln!で書き込む方法が推奨されています(std公式ドキュメント, println!)。
この辞書が使われているページ
backlinks 6