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 模板引擎
16,737 个月下载量
用于 6 个 Crates (4 直接)
32KB
469 行
fomat-macros
这个 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
如您所见,我们使用要打印的 东西 列表而不是格式字符串和参数,没有任何分隔符。每个 东西 都可以是字符串字面量或括号中的表达式(除了 ()
和 []
,还有大括号 {}
,可以用作更高级的格式说明符,请参阅文档)。
您还可以在宏内使用 if
、if let
、match
和 for
构造。它们使用常规 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::Write
或 fmt::Write
,但在极少数情况下,如果你使用的是自定义的东西,你应该查阅源代码。
它是一种模板语言吗?
有点像,但请不要将其用作安全关键代码的HTML模板语言,因为它不对特殊字符进行转义。