使用旧的 Rust 2015
0.3.1 |
|
---|
#92 in #interpolation
32KB
469 行
格式宏
此包提供了 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
如你所见,我们有一个打印项的列表,而不是格式字符串和参数,没有任何分隔符。每个 项 可能是一个字符串字面量或括号中的表达式(除了 ()
和 []
,还可以使用花括号 {}
,它们可以用于更高级的格式说明符,请参阅文档)。
您也可以在宏内部使用 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模板语言,因为它不执行特殊字符的转义。