#fmt #adapter #newtype #format #displayfromdebug

no-std fmt_adapter

提供从任何格式化特质到新类型适配器以及反向的适配器

1 个不稳定版本

0.2.1 2020年3月26日
0.2.0 2020年3月26日
0.1.0 2020年3月26日

#2422Rust 模式

CC0 许可证

13KB
123

fmt_adapter

Crates.io Docs.rs

这个包提供了从任何格式化特质到新类型适配器以及反向的适配器。更具体地说,它允许将一个值包装到一个过滤器包装器中,该包装器过滤掉除了一个之外的所有格式化特质的实现,然后将其包装到一个适配器包装器中,该包装器实现了一个特定的格式化特质,这可以与原始格式化特质不同。这可以通过一个例子更好地说明

// Let's create an example type...
#[derive(Copy, Clone, Debug)]
enum Sign {
    Positive,
    Negative
}
//...and implement a formatting trait by hand.
impl fmt::Display for Sign {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{}",
            match self {
                Positive => '+',
                Negative => '-'
            }
        )
    }
}

let sign = Sign::Positive;
println!("The sign character is {}", sign); // Outputs the Display formatting
println!("The sign debug form is {:?}", sign); // Outputs the derived Debug formatting
let sign = DebugFromDisplay(sign); // Wrap it into a formatting adapter
println!("The sign debug form is {:?}", sign); // Outputs the Display formatting, even
                                               // though we have {:?} as the formatting mode
let sign = UpperHexFromDebug(sign.0); // Get the value from the previous adapter
                                      // and do something very random
println!("The sign in uppercase hexadecimal is `0x{:X}`", sign);

这个包中的所有适配器都是通过一个构建脚本从一个特质列表生成的。因此,不能手动编辑适配器声明及其impl块。如果您想探索生成的结果,请使用cargo download并构建该包,或者简单地查看build.rs文件。

该包是#![no_std],这意味着它在独立环境中工作,并且只依赖于core::fmt,这需要一个功能的全局分配器。

适配器类型

以下是一个适配器类型的列表({}之间的值可以用任何格式化特质替换)

  • {trait} — 过滤掉类型的所有格式化特质除了{trait}。这可以在在子系统之间传输对象时限制对格式化特质的访问。
  • {out_tr}From{in_tr} —— 通过使用 {in_tr} 的格式化结果来实现 {out_tr}。这可以用于为只接受一种特定格式化方法的接口提供任意格式化方法,同时仍然完全按照 fmt 文档的指定正确实现其他格式化特性。

无运行时依赖