如何在Rust中用format!宏生成无换行空格的格式化多行原始字符串?
解决方案
原生方法:手动控制缩进与换行
如果不想引入第三方库,有两种思路解决问题:
方式1:顶格编写原始字符串
直接把多行字符串内容顶格书写,既保留原始字符串无需转义引号、不用行末反斜杠的优势,又不会产生多余前置空格:
fn main() { let name = "Alice"; let age = 30; let msg = format!(r#"Hello, my name is {name}. I'm {age} years old. I love writing Rust code!"#); println!("{}", msg); }
输出结果:
Hello, my name is Alice. I'm 30 years old. I love writing Rust code!
方式2:处理带缩进的原始字符串
如果为了代码结构美观必须给字符串加缩进,可以通过字符串方法去除多余空白:
fn main() { let name = "Bob"; let age = 25; let raw_str = r#" Hello, {name}, You are {age} years old. Glad to see you! "#; // 先去掉开头换行,再逐行修剪前置空格后重新拼接 let processed_str = raw_str .trim_start() .lines() .map(|line| line.trim_start()) .collect::<Vec<_>>() .join("\n"); let msg = format!(processed_str); println!("{}", msg); }
输出结果:
Hello, Bob, You are 25 years old. Glad to see you!
第三方库方案:使用indoc crate(推荐)
indoc是专门处理缩进多行字符串的Rust库,能自动去除每行的共同前置缩进,同时保留原始字符串的所有优势,是最省心的方案。
步骤1:添加依赖到Cargo.toml
[dependencies] indoc = "2.0"
步骤2:用indoc!宏处理字符串
use indoc::indoc; fn main() { let name = "Charlie"; let age = 35; let msg = format!(indoc! {r#" Hello, {name}, Your age is {age}. This string has proper indentation in code, but no extra spaces in output! "#}); println!("{}", msg); }
输出结果:
Hello, Charlie, Your age is 35. This string has proper indentation in code, but no extra spaces in output!
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

