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

如何在Rust的format!宏中实现Python式的{var=}变量名值打印?

在Rust中实现Python式的{var=}格式化功能

Rust 1.58及以上版本已经原生支持和Python {var=}完全一致的格式化语法,直接在format!、println!等格式化宏中使用即可,不需要额外依赖或自定义实现。

原生用法示例

直接在格式化字符串中使用{变量名=}的语法,就能同时输出变量名和对应的值,且重命名变量时rust-analyzer会自动同步修改格式化字符串中的名称,避免不一致:

fn main() {
    let current_progress = 75;
    let total_tasks = 100;
    let status = "processing";

    // 生成用于进度条的字符串
    let progress_bar_label = format!(
        "{current_progress=} / {total_tasks=}, {status=}"
    );

    println!("{}", progress_bar_label);
    // 输出:current_progress=75 / total_tasks=100, status="processing"
}

你之前尝试的{var:=}是错误的语法,正确的写法就是{var=}——这个特性叫做格式化参数捕获(format args capture),专门用来解决重复输入变量名的痛点。

旧版本Rust的兼容方案

如果你的项目还在使用1.58以下的Rust版本,可以自己实现一个简单的宏来达到同样的效果:

// 单个变量的格式化宏
macro_rules! var_str {
    ($var:ident) => {
        format!("{}={}", stringify!($var), $var)
    };
    // 支持多个变量,用逗号分隔
    ($($var:ident),+) => {
        format!("{}", $(var_str!($var)),+)
    };
}

fn main() {
    let var1 = 10;
    let var2 = "test";
    
    let s = var_str!(var1);
    println!("{}", s); // 输出:var1=10

    let multi_vars = var_str!(var1, var2);
    println!("{}", multi_vars); // 输出:var1=10,var2=test
}

这个宏利用stringify!宏获取变量的字面名称,再拼接变量的值,同样能避免重复输入变量名,且变量重命名时IDE会同步更新。

关于dbg!的补充

dbg!宏确实无法直接返回字符串(它会将内容输出到stderr并返回变量本身),而原生的{var=}语法和上面的自定义宏都能生成普通的String,完全可以用于进度条、日志输出等场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:25:23