格式化輸出
rust中由一些宏(macro)負(fù)責(zé)輸出,這些宏定義在std::fmt中,下面是一些常用的宏:
- format!():向字符串中輸出格式化字符串。
- print()!:向標(biāo)準(zhǔn)輸出打印字符串。
- println()!:向標(biāo)準(zhǔn)輸出打印字符串,同時會打印一個換行符。
- eprint()!:向標(biāo)準(zhǔn)錯誤打印字符串。
- eprintln()!:向標(biāo)準(zhǔn)錯誤打印字符串,同時也會打印一個換行符。
println的使用
- 使用{}通配符
println!("{} days", 31);
- 在{}中使用位置參數(shù)
println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");
- 在{}中使用命名參數(shù)
println!("{subject} {verb} {object}",
object="the lazy dog",
subject="the quick brown fox",
verb="jumps over");
- 在{}中指定字符串格式化的方式
// 以二進(jìn)制的格式打印數(shù)字
println!("{} of {:b} people know binary, the other half doesn't", 1, 2);
- 在{}中指定對齊方式以及對其寬度
// 右對齊寬度為6
println!("{number:>width$}", number=1, width=6);
// 使用字符0填充對齊的字符串
println!("{number:>0width$}", number=1, width=6);
- rust編譯器會對格式化字符串的參數(shù)數(shù)量進(jìn)行校驗
// 由于參數(shù)數(shù)量不足,編譯器會報錯
println!("My name is {0}, {1} {0}", "Bond");
- println無法直接打印自定義類型
#[allow(dead_code)]
struct Structure(i32);
// 由于無法打印,編譯器會報錯
println!("This struct `{}` won't print...", Structure(3));
fmt::Debug的使用
fmt::Debug的作用是以調(diào)試的目的打印字符串 fmt::Debug是Rust標(biāo)準(zhǔn)庫已經(jīng)定義好的,我們可以通過繼承的方式,獲得fmt::Debug的能力,在格式化中使用占位符{:?}。
#[derive(Debug)]
struct Structure(i32);
println!("Now {:?} will print!", Structure(3));
// 我們可以用稍微優(yōu)雅的一點的方式打印
println!("{:#?}", Structure(3));
fmt::Display的使用
fmt::Display是一個用于自定義格式化輸出的接口,如果需要按照我們自定義的格式進(jìn)行格式化,我們只需要實現(xiàn)該接口就可以了
#[derive(Debug)]
struct MinMax(i64, i64);
// Implement `Display` for `MinMax`.
impl fmt::Display for MinMax {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// Use `self.number` to refer to each positional data point.
write!(f, "({}, {})", self.0, self.1)
}
}
println!("Compare structures:");
// 自定義后,格式化占位符仍然使用{}
println!("Display: {}", minmax);
println!("Debug: {:?}", minmax);
一個list類型的對象的自定義格式化輸出
use std::fmt; // Import the `fmt` module.
// Define a structure named `List` containing a `Vec`.
struct List(Vec<i32>);
impl fmt::Display for List {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
// Extract the value using tuple indexing,
// and create a reference to `vec`.
let vec = &self.0;
write!(f, "[")?;
// Iterate over `v` in `vec` while enumerating the iteration
// count in `count`.
for (count, v) in vec.iter().enumerate() {
// For every element except the first, add a comma.
// Use the ? operator, or try!, to return on errors.
if count != 0 { write!(f, ", ")?; }
write!(f, "{}", v)?;
}
// Close the opened bracket and return a fmt::Result value.
write!(f, "]")
}
}
fn main() {
let v = List(vec![1, 2, 3]);
println!("{}", v);
}
format的使用
format!("{}", foo) -> "3735928559"
format!("0x{:X}", foo) -> "0xDEADBEEF"
format!("0o{:o}", foo) -> "0o33653337357"
|