#string-interpolation #macro #multiline #white-space #variables #leading #basic

ext_format

一个小巧但强大的Rust库,用于字符串插值

2个版本

0.1.1 2023年9月3日
0.1.0 2023年9月3日

过程宏 中排名第 461

MIT 许可证

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