如何在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
相关产品推荐
相关产品推荐

