Rust中如何定义代码无尾随空格但值含尾随空格的字符串字面量
Rust 多行带尾随空格字符串的优雅写法
最优实现(零依赖、无源码尾随空格、和原写法差异极小)
直接使用Rust原生的字符串行尾续行语法,写法如下:
let expected = " foo a\n\ b\n\ \n\ c\n\ d ";
这个写法生成的字符串和预期内容完全一致,且源码中不存在任何行尾尾随空格,编辑器的自动清理尾随空格功能不会对内容产生任何影响。
实现原理
Rust字符串字面量中,行尾的\会转义(吃掉)紧随其后的源码换行符,实现「源码换行但实际字符串不插入换行」的效果。你只需要在需要保留换行的位置手动写\n,再把原本需要放在上一行末尾的尾随空格,全部移动到续行的下一行开头即可:
- 行首空格不属于尾随空格,不会被编辑器自动清理
- 所有空格依然以可见的形式对齐展示,读代码时可以直观判断每一行的空格数量,和原写法的视觉体验几乎一致
方案优势
- 完全基于Rust原生语法,兼容所有Rust版本,无任何额外依赖
- 不需要要求协作者修改编辑器配置,不影响全局的尾随空格清理特性
- 没有冗余的宏拼接、转义字符,代码量和原写法基本持平
- 空格可视化对齐,后续维护时不容易写错数量
备选方案
如果不习惯续行写法,可以选择以下可工作的方案,但体验略逊于上面的实现:
- 用
concat!宏按行拆分拼接
let expected = concat!( "\n", "foo a\n", " b\n", " \n", " c\n", " d\n", );
这种写法每一行内容独立,所有空格都包裹在字符串内部,不存在源码尾随空格;缺点是每行需要额外加引号和逗号,书写更繁琐。
注意:不推荐用\x20/\u{20}转义序列表示空格,这类写法会把可见的空格变成转义字符,后续维护时很难数清空格数量,非常容易引入错误。
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

