Rust 代码/装饰器在运行时打印/捕获源代码

问题描述 投票:0回答:1

我有一个 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>"#
并手动转义每个
{
}

我觉得我可以为执行转义和打印的代码块编写一个装饰器。 但如果我是第一个想要以编程方式打印源代码(或者至少以某种方式将代码块捕获为字符串)的人,我会感到惊讶。 有谁知道类似的事情吗?

rust printing decorator
1个回答
0
投票

您可以通过将字符串与格式字符串分开来避免转义

{
}

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 中,装饰器被称为属性。您可以使用程序宏创建自己的属性。但是,您需要小心插入打印件的位置。

© www.soinside.com 2019 - 2024. All rights reserved.