#macro #print #format #interpolation #template

fomat-macros

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

7 个版本

使用旧的 Rust 2015

0.3.2 2023 年 1 月 24 日
0.3.1 2019 年 2 月 24 日
0.2.1 2017 年 7 月 26 日
0.2.0 2017 年 1 月 3 日
0.1.1 2016 年 11 月 21 日

#34 in 模板引擎

Download history 5212/week @ 2024-04-21 4966/week @ 2024-04-28 4637/week @ 2024-05-05 4703/week @ 2024-05-12 5186/week @ 2024-05-19 5109/week @ 2024-05-26 3768/week @ 2024-06-02 4588/week @ 2024-06-09 6046/week @ 2024-06-16 5421/week @ 2024-06-23 4943/week @ 2024-06-30 6038/week @ 2024-07-07 5500/week @ 2024-07-14 4347/week @ 2024-07-21 2773/week @ 2024-07-28 3610/week @ 2024-08-04

16,737 个月下载量
用于 6 个 Crates (4 直接)

MIT 许可证

32KB
469

fomat-macros

文档crate

这个 crate 提供了 Rust 标准库中的 write!writeln!print!println!eprint!eprintln!format! 宏的替代语法。

这个 crate 中的宏名称是通过从其 std 对应项中删除字母 r 来形成的:wite!witeln!pint!pintln!epint!epintln!fomat!

安装

将此添加到您的 Cargo.toml

[dependencies]
fomat-macros = "0.3.2"

并在您的 .rs 文件中使用宏,例如。

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模板语言,因为它不对特殊字符进行转义。

无运行时依赖