Rust中的多行字符串:语法、示例与技巧

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust中的多行字符串:如何不被引号和反斜杠逼疯

\n\n

嘿,朋友!如果你曾经写过Python,你就会知道在那里创建多行字符串简直易如反掌:三个引号 """...""" 就搞定了。但当你转向Rust时,你突然发现这个惯用技巧行不通了。于是你开始搜索:“What is the syntax for a multiline string literal?”。熟悉吗?

\n\n

别担心,这是Rust新手最常问的问题,在Stack Overflow上获得了数千次浏览。今天我们就一劳永逸地搞清楚如何在Rust中处理长字符串,而不让你抓狂。开始吧!

\n\n

为什么Rust不喜欢三引号(像Python那样)?

\n\n

Rust是一门系统级且严谨的语言。它不容许随意。在Rust中,三引号 """ 并不是多行字符串的语法,而是注释或文档注释(如果是 ///)的开始。所以如果你尝试这样写:

\n\n
// ❌ 这样不行!\nlet text = """这是\n多行\n字符串""";\n
\n\n

编译器会带着责备的眼神看着你,然后报错。Rust处理多行字符串用的是另一种方法——而且它甚至比Python的更酷!

\n\n

方法 #1:普通引号和换行符

\n\n

最简单的方法就是在代码中直接断开字符串,在字符串内部使用 \\n 字符。但这很无聊且不易读。更有趣的是在双引号内使用真正的换行符。Rust允许这样做!

\n\n
// ✅ 可行!\nlet poem = "这是一个字符串示例,\n它占据了两行,\n这在Rust中是完全合法的。";\nprintln!("{}", poem);\n
\n\n

输出将包含你在代码中放置换行符的位置。但有一个问题:如果你想保留缩进(行首的空格),它们也会被包含在字符串中。有时这很有用,有时则不然。

\n\n

方法 #2:转义和反斜杠——你的朋友(也是敌人)

\n\n

如果你需要在代码中写一个长字符串,但不想在其中添加换行符(例如为了可读性),请在行尾使用反斜杠:

\n\n
// ✅ 没有换行符的字符串,但在代码中可读\nlet long_string = "这是一个非常长的字符串,\\\n在代码中被分成多行,\\\n但在内存中会是一个没有\\n的字符串。";\nprintln!("{}", long_string);\n
\n\n

注意:反斜杠后面不能有空格——必须直接按回车。否则Rust会认为你在转义空格,然后一切都会出错。

\n\n

方法 #3:原始字符串字面量——无需转义的魔法

\n\n

这就是Rust的秘密武器了。如果你需要编写一个包含大量引号、反斜杠或其他特殊字符(例如JSON、正则表达式或Windows路径)的字符串,请使用 r"" —— 原始字符串字面量。

\n\n

在 r"..." 内部,所有字符都会被按字面意义处理。无需任何转义!

\n\n
// ✅ 原始字符串——没有反斜杠!\nlet json = r#"{\n    "name": "Rust",\n    "version": 1.75,\n    "features": ["安全", "速度"]\n}"#;\nprintln!("{}", json);\n
\n\n

但如果字符串内部出现了 "# 该怎么办?为此,Rust允许增加引号周围的 # 数量:r##"..."##、r###"..."###,以此类推,直到无穷。只需选择一个在字符串内部不会出现的井号数量即可。

\n\n
// ✅ 带井号转义的原始字符串\nlet tricky = r###"包含"引号"甚至内部"#"的字符串!"###;\nprintln!("{}", tricky);\n
\n\n

方法 #4:多行原始字符串——处理复杂数据的利器

\n\n

现在我们把所有方法结合起来。如果你需要编写一个包含引号、反斜杠和缩进的多行文本块,请直接在内部使用带换行符的 r#""#:

博客

书籍推荐