#print #macro #format #interpolation #template #debugging

已删除 格式宏测试

带有小型模板语言的类似 print/write/format 宏的替代语法

使用旧的 Rust 2015

0.3.1 2022年11月16日

#92 in #interpolation

MIT 许可证

32KB
469

格式宏

文档, crate

此包提供了 write!writeln!print!println!eprint!eprintln!format! 宏的替代语法,这些宏来自 Rust 标准库。

此包中宏的名称由从其 std 对应版本中移除字母 r 而形成:wite!witeln!pint!pintln!epint!epintln!fomat!

安装

将此添加到您的 Cargo.toml

[dependencies]
fomat-macros = "0.3.1"

并在您的 .rs 文件中 use 这些宏,例如。

use fomat_macros::pintln;

此版本需要 Rust 1.30。对于对旧版本的支持,请参阅 版本 0.2.1

示例

pintln!("Hello, world!");
pintln!(); // empty line
pintln!("The answer is "(40 + 2)); // parentheses use the Display trait
pintln!([vec![1, 2, 3]] " -- numbers"); // brackets use the Debug trait

如你所见,我们有一个打印项的列表,而不是格式字符串和参数,没有任何分隔符。每个 可能是一个字符串字面量或括号中的表达式(除了 ()[],还可以使用花括号 {},它们可以用于更高级的格式说明符,请参阅文档)。

您也可以在宏内部使用 ifif letmatchfor 结构。它们使用常规 Rust 语法,但 {} 块内部将再次使用打印项列表语法。

let list = vec![1, 2, 3];
let s = fomat!( for x in &list { (x) " :: " } "nil" );
// s == "1 :: 2 :: 3 :: nil"

循环也可以使用可选的分隔符。有关详情,请参阅文档。

还有用于调试的快捷方式,它会同时打印表达式和值。要启用,请在任何类型的括号内将=作为第一个字符。

let list = vec![1, 2, 3];
epintln!([=list]); // prints list = [1, 2, 3]

为什么?

创建这个crate的动机是什么?

  • 更本地化 - 所有内容都是按照将被打印的顺序编写的。但这可能是个人的偏好。

  • 更容易重构 - 尤其是在你突然想在长格式字符串中添加条件打印时。比较

    let s = fomat!(
        "first line\n"
        if condition() { (foo) }
        "third line\n"
    );
    
    let s = {
        use ::std::fmt::Write;
        let mut s = "first line\n".to_owned();
        if condition() { write!(s, "{}", foo).unwrap() }
        write!(s, "third line\n").unwrap();
        s
    };
    
  • 速度!fomat!可能比format!快(参见cargo bench)。这是因为fomat!的单次调用只有一个虚拟调用,而std::format!的每个参数都有一个。

限制

write!writeln!宏对所有具有.write_fmt方法的对象都有效。这个crate还需要.write_str方法。它适用于任何io::Writefmt::Write,但在不常见的情况下,如果你使用的是自定义内容,你应该查阅源代码。

它是一种模板语言吗?

有点像,但请勿将其用作安全关键代码的HTML模板语言,因为它不执行特殊字符的转义。

无运行时依赖