【Rust 笔记】15-字符串与文本(下)

本文介绍Rust语言中的格式化宏及其使用方法,包括格式化文本、数值和其他类型;并详细讲解了正则表达式库的使用,包括构建Regex值、基本用法及规范化处理。

15.4 - 格式化值

  • 格式化宏:总是借用对其参数的共享引用,不会取得所有权,也不会修改它们。

  • 只要实现了

    std::fmt
    

    模块的格式化特型,就可以扩展下述宏,以支持自定义类型:

    • format!:使用模板来构建 String
    • println!print!:将格式化后的文本写入标准输出流。
    • writeln!write!:将格式化后的文本写入指定输出流。
    • panic!:使用模板构建一个终止诧异的表达式,可以包含自定义的信息。
    • format_args! 宏和 std::fmt::Arguments 类型:可以写出自定义的支持格式化语言的函数和宏。
  • 模板中的每个 {},都会被后面某个参数的格式化形式取代。模板字符串必须是常量。

  • 模板的

    {}
    

    部分称为格式化形参,形式为

    {which:how}
    

    • whichhow 是可选的。
    • which 部分用于选择使用模板后面的哪个参数来填补当前位置。可以通过索引或名称来选择参数。没有 which 部分的形参会简单地从左往右应用参数。
    • how 部分用于指定如何格式化参数:加多少空白、精度和基数多少。如果有 how 参数,那么前面的冒号是必须的。
模板字符串 参数列表 结果
"number of {}: {}" "elephants", 19 "number of elephants: 19"
"from {1} to {0}" "the grave", "the cradle" "from the cradle to the grave"
"v = {:?}" vec![0, 1, 2, 5, 12, 29] "v = [0, 1, 2, 5, 12, 29]"
"name = {:?}" "Nemo" "name = \"Nemo\""
{: 8.2} km/s"" "11.186" " 11.19 km/s"
"{: 20} {: 02x} {: 02x}" "adc #42", 105, 42 "adc #42 69 2a"
"{1:02x} {2:02x} {0}" "adc #42", 105, 42 "69 2a adc #42"
"{lsb:02x} {msb:02x} {insn}" insn="adc #42", lsb = 105, msb = 42 "69 2a adc #42"

15.4.1 - 格式化文本值

格式化 &strStringchar 等同于只有一个字符的字符串)文本类型时,格式化形参 how 部分可以包含如下可选内容:

使用的特性 模板字符串 结果
默认 "{}" "bookends"
最小字段宽度 "{: 4}" "bookends"
"{: 12}" "bookends "
文本长度限制 "{:. 4}" "book"
"{:. 12}" "bookends"
字段宽度及长度限制 "{: 12.20}" "bookends "
"{: 4.20}" "bookends"
"{: 4.6}" "booken"
"{: 6.4}" "book "
左对齐,字段宽度 "{: <12}" "bookends "
居中对齐,字段宽度 "{: ^12}" " bookends "
右对齐,字段宽度 "{: >12}" " bookends"
填充 =,居中对齐,字段宽度 "{: =^12}" "==bookends=="
填充 *,右对齐,字段宽度,长度限制 "{: *>12.4}" "********book"
  • &strString 之外,也可以给格式化宏传入引用目标为文本的智能指针类型,比如 Rc<String>Cow<'a, str>

  • 不能直接把文件名路径 std::path::Path 传给格式化宏,但可以使用 Pathdispaly 方法返回的值进行格式化。

    println!("processing file: {}", path.display());
    

15.4.2 - 格式化数值

当格式化参数具有 usizef64 数值类型时,形参 how 的值必须包含,有以下可选组成部分。

  • 格式化数值
使用的特性 模板字符串 结果
默认 "{}" "1234"
强制符号 "{: +}" "+1234"
最小字段宽度 "{: 12}" " 1234"
"{: 2}" "1234"
符号,宽度 "{: +12}" " +1234"
前置零,宽度 "{: 012}" "000000001234"
符号,前置零,宽度 "{: +012}" "+00000001234"
左对齐,宽度 "{: <12}" "1234 "
居中对齐,宽度 "{: ^12}" " 1234 "
右对齐,宽度 "{: >12}" " 1234"
左对齐,符号,宽度 "{: <+12}" "+1234 "
居中对齐,符号,宽度 "{: ^+12}" " +1234 "
右对齐,符号,宽度 "{: >+12}" " +1234"
填充 =,居中对齐,宽度 "{: =^12}" "====1234===="
二进制计数法 "{: b}" "100110100010"
宽度,八进制计数法 "{: 12o}" " 2322"
符号,宽度,十六进制计数法 "{: +12x}" " +4d2"
符号,宽度,大写十六进制计数法 "{: +12X}" " +4D2"
符号,基数前缀,宽度,十六进制 "{: +#12x}" " +0x4d2"
符号,基数,补零,宽度,十六进制 "{: +#012x}" "+0x0000004d2"
"{: +#06x}" "+0x4d2"
  • 格式化浮点数
使用的特性 模板字符串 结果
默认 "{}" "1234.5678"
精度 "{:. 2}" "1234.57"
"{:. 6}" "1234.567800"
最小字段宽度 "{: 12}" " 1234.5678"
宽度,精度 "{: 12.2}" " 1234.57"
"{: 12.6}" " 1234.567800"
前置零,宽度,精度 "{: 012.6}" "01234.567800"
科学计数法 "{: e}" "1.234578e3"
科学计数法,精度 "{: 3e}" "1.235e3"
科学计数法,宽度,精度 "{: 12.3e}" " 1.235e3"
"{: 12.3E}" " 1.235E3"

15.4.3 - 格式化其他类型

  • 每种错误类型都应该实现 std::error::Error 特型,该特型扩展支持了默认的格式化特型 std::fmt::Display。任何实现 Error 的类型都是可以格式化的。
  • std::net::IpAddrstd::net::SocketAddr 类型:可以格式化互联网协议地址。
  • truefalse 布尔值:可以直接格式化。

15.4.4 - 为调试格式化值

  • {:?} 格式:可以调试和输出日志,也支持格式化任意 Rust 标准库中的公共类型。

    • 可以用来检查向量、切片、元组、散列表、线程等数百种类型。

    • 使用#[derive(Debug)] 语法,可以让自定义类型支持 {:?}

      #[derive(Copy, Clone, Debug)]
      struct Complex {
             
             
          r: f64,
          i: f64
      }
      let third = Complex {
             
              r: -0.5, i: f64::sqrt(0.75) };
      println!("{:?}", third);
      // 输出结果
      Complex {
             
              r: -0.5, i
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

phial03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值