You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求Rust中自动打印/捕获运行时代码块的装饰器方案

现成解决方案推荐

针对你遇到的代码冗余和手动转义问题,已有几个成熟的Rust工具可以直接用,不用自己从头写装饰器:

1. 使用quote宏实现自定义演示宏

quote crate原本用于代码生成,它可以将代码块转换为TokenStream,转为字符串时会自动处理{}等符号的转义。你可以基于它快速封装一个自己的演示宏:

use quote::quote;

// 自定义演示宏:打印代码块并执行
macro_rules! demo {
    ($code:block) => {
        // 将代码块转为字符串并打印
        let code_str = quote!($code).to_string();
        println!("```rust\n{}\n```", code_str);
        // 执行代码块
        $code;
    };
}

fn main() {
    // 使用宏,只写一次代码块
    demo! {
        let num = 3;
        println!("数字的平方是: {}", num * num);
    }
}

运行后会先打印格式化的代码块,再执行逻辑,完全避免了重复编写和手动转义。

2. 直接使用现成的show-code crate

这个crate专门为演示场景设计,提供了开箱即用的宏,无需自己封装:

首先在Cargo.toml中添加依赖:

[dependencies]
show-code = "0.2"

然后在代码中使用:

use show_code::show_code;

fn main() {
    show_code! {
        let greeting = "Hello, Rust!";
        println!("{}", greeting);
    }
}

show_code!宏会自动完成代码字符串的生成(含转义)、打印,以及代码执行的全部流程,完全满足你的需求。

3. 结合rustfmt优化代码格式

如果需要让打印出来的代码更美观(比如自动格式化),可以配合rustfmt crate对生成的代码字符串做格式化处理,比如在quote的基础上增加格式化步骤:

use quote::quote;
use rustfmt_nightly::format_code;

macro_rules! demo {
    ($code:block) => {
        let code_str = quote!($code).to_string();
        // 格式化代码字符串
        let formatted = format_code(&code_str).unwrap_or(code_str);
        println!("```rust\n{}\n```", formatted);
        $code;
    };
}

这样打印出来的代码会符合Rust官方风格,更适合放到README中。

内容的提问来源于stack exchange,提问作者tarski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:57:39