我有一个 main.rs 文件,其重复形式如下
fn main() {
println!(r#"<CODE BLOCK 1>"#);
<CODE BLOCK 1>
println!(r#"<CODE BLOCK 2>"#);
<CODE BLOCK 2>
...
}
(我这样做是为了生成一个演示该库的 README.md。)
明显的问题是,该函数感觉是它可能需要的两倍长,并且每当我对代码块进行更改时,我都需要确保更改另一个位置。 另外,我必须遍历每个
r#"<CODE BLOCK 1>"#
并手动转义每个 {
和 }
。
我觉得我可以为执行转义和打印的代码块编写一个装饰器。 但如果我是第一个想要以编程方式打印源代码(或者至少以某种方式将代码块捕获为字符串)的人,我会感到惊讶。 有谁知道类似的事情吗?
您可以通过将字符串与格式字符串分开来避免转义
{
和 }
。
println!("{}" "<CODE BLOCK 1>");
您还可以使用宏来复制和字符串化代码。
macro_rules! print_code {
($($t:tt)*) => {
println!("{}", stringify!($($t)*));
$($t)*
}
}
fn main() {
print_code! {
let a = 5;
}
print_code! {
let b = 5;
}
print_code! {
println!("{}", a + b);
}
}
在 Rust 中,装饰器被称为属性。您可以使用程序宏创建自己的属性。但是,您需要小心插入打印件的位置。