午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

Rust中的格式化輸出

 lichwoo 2021-07-10

格式化輸出

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的使用

  1. 使用{}通配符
println!("{} days", 31);
  1. 在{}中使用位置參數(shù)
println!("{0}, this is {1}. {1}, this is {0}", "Alice", "Bob");
  1. 在{}中使用命名參數(shù)
println!("{subject} {verb} {object}",
             object="the lazy dog",
             subject="the quick brown fox",
             verb="jumps over");
  1. 在{}中指定字符串格式化的方式
// 以二進(jìn)制的格式打印數(shù)字
println!("{} of {:b} people know binary, the other half doesn't", 1, 2);
  1. 在{}中指定對齊方式以及對其寬度
// 右對齊寬度為6
println!("{number:>width$}", number=1, width=6);
// 使用字符0填充對齊的字符串
println!("{number:>0width$}", number=1, width=6);
  1. rust編譯器會對格式化字符串的參數(shù)數(shù)量進(jìn)行校驗
// 由于參數(shù)數(shù)量不足,編譯器會報錯
println!("My name is {0}, {1} {0}", "Bond");
  1. 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"
  • 以十六進(jìn)制數(shù)的形式輸出
format!("0x{:X}", foo) -> "0xDEADBEEF"
  • 以八進(jìn)制的形式輸出
format!("0o{:o}", foo) -> "0o33653337357"

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多