2个版本
0.1.1 | 2023年9月3日 |
---|---|
0.1.0 | 2023年9月3日 |
在 过程宏 中排名第 461
48KB
1K SLoC
ext_format
一个小巧但强大的Rust库,用于字符串插值。受Rust宏规则的启发,它提供了两个主要宏:ext_format!
和 ext_format_unindent!
ext_format_unindent!
宏与 ext_format!
完全相同,但首先修剪前导空格,以便更轻松地处理多行字符串。
安装
将以下内容添加到您的 Cargo.toml
[dependencies]
ext_format = "0.1.0"
用法
基本插值
使用 $
进行基本插值
let name = "Alice";
let output = ext_format!("Hello, $name!");
绑定新变量名
使用 {name:new_name}
将新名称绑定到变量。
let number = 42;
let output = ext_format!("Number: ${number:n} $n $n");
// Output: "Number: 42 42 42"
基本重复
$($var)*
:无分隔符$($var),*
:字符作为分隔符$($var)(...)*
:字符串作为分隔符(支持转义字符)
let numbers = vec![1, 2, 3];
let output = ext_format!("Numbers: $($numbers),*");
// Output: "Numbers: 1, 2, 3"
用于使用换行符作为分隔符
let items = vec!["apple", "banana", "cherry"];
let output = ext_format!("Items:\n$($items)(\n)*");
// Output:
// Items:
// apple
// banana
// cherry
隐藏变量的重复
使用 @
包含控制循环但不在输出中包含的变量。
let items = vec!["apple", "banana"];
let counter = vec![1, 2];
let output = ext_format!("Items:\n$(@counter)$($items)\n)*");
// Output:
// Items:
// apple
// banana
具有命名迭代变量的重复
使用 {name:new_name}
将名称绑定到变量。
let numbers = vec![1, 2, 3];
let output = ext_format!("Numbers: $(${numbers:number} $number),*");
// Output: "Numbers: 1 1, 2 2, 3 3"
嵌套重复
重复可以包含其他重复,类似于嵌套的for循环
let matrix = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
let output = ext_format!("Matrix:\n$(@{matrix:row}$($row) *)(\n)*");
// Output:
// Matrix:
// 1 2 3
// 4 5 6
// 7 8 9
压缩变量
单个重复层中的变量自动压缩在一起,这意味着它们会同步迭代。
let names = vec!["Alice", "Bob"];
let ages = vec![30, 40];
let output = ext_format!("Profiles:\n$($names $ages)\n)*");
// Profiles:
// Alice 30
// Bob 40
多行字符串
对于多行字符串,可以使用 ext_format_unindented
来避免前面的空白字符。
fn unindented() -> String {
let matrix = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
ext_format_unindented!(r#"
void func3() {
$(@{matrix:inner_matrix}printf("$($inner_matrix) *");)(\n )*
}
"#)
}
let output = unindented();
// Output:
// void func3() {
// printf("1 2 3");
// printf("4 5 6");
// printf("7 8 9");
// }
如果在这里使用了常规的 ext_format
,则会导致以下结果
fn indented() -> String {
let matrix = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
ext_format!(r#"
void func3() {
$(@{matrix:inner_matrix}printf("$($inner_matrix) *");)(\n )*
}
"#)
}
let output = indented();
// Output:
// void func3() {
// printf("1 2 3");
// printf("4 5 6");
// printf("7 8 9");
// }
生成的字符串的缩进取决于函数本身的缩进。
许可证
本项目采用 MIT 许可证。有关详细信息,请参阅 LICENSE.md 文件。
依赖项
约 250KB