如何在Rust中编写多行字符串?

67

是否有可能编写类似这样的代码:

fn main() {
    let my_string: &str = "Testing for new lines \
                           might work like this?";
}

7
可能是重复问题:如何编写多行字符串字面值的语法? - wizzwizz4
2
这个问题比重复问题早两年。 - sdasdadas
1
没问题。 - wizzwizz4
2
投票关闭为重复,因为这里没有任何可接受的答案,而新问题已得到正确回答。 - Denys Séguret
5个回答

51
如果我正确理解语言参考,那么看起来应该可以工作。语言参考指出,\n等被支持(作为常见转义字符,用于将换行符插入字符串中),还包括“其他转义字符”,包括LF、CR和HT。

18
李说得对。反斜杠可以用于将字符串常量延伸到多行。第二行的前导空格会被省略。 - Niko Matsakis
谢谢 - 我原来的代码有一个不同的错误,让我认为 '' 不起作用。 - sdasdadas

36

另一种方法是使用原始字符串字面量

原始字符串字面量不处理任何转义。它们以字符U+0072r)开头,后跟零个或多个字符U+0023#)和一个U+0022(双引号)字符。原始字符串主体可以包含任何Unicode字符序列,并且仅由另一个U+0022(双引号)字符终止,后跟与打开的U+0022(双引号)字符之前使用的相同数量的U+0023(#)字符。

原始字符串主体中包含的所有Unicode字符都表示它们本身,字符U+0022(双引号)(除非紧随其后至少使用与开始原始字符串字面量时相同数量的U+0023#)字符),或字符U+005C\)没有任何特殊含义。

字符串字面量示例:

"foo"; r"foo";                     // foo
"\"foo\""; r#""foo""#;             // "foo"

"foo #\"# bar";
r##"foo #"# bar"##;                // foo #"# bar

"\x52"; "R"; r"R";                 // R
"\\x52"; r"\x52";                  // \x52
抱歉,我现在只能用英文进行交流。

7
没错,但不是必须的。在Rust中,每个字符串字面值都可以跨越多行。 - DenisKolodin

22

如果您想避免出现换行符和额外的空格,可以使用 concat! 宏。它可以在编译时将字符串字面量连接起来。

let my_string = concat!(
    "Testing for new lines ",
    "might work like this?",
);

assert_eq!(my_string, "Testing for new lines might work like this?");

带反斜杠的被接受的答案同样也去除了多余的空格。


可能是我见过的最好的解决方案。谢谢。 - hfingler

6

在 Rust 中每个字符串都是多行字符串。

但是,如果你的文本中有缩进,例如:

fn my_func() {
    const MY_CONST: &str = "\
    Hi!
    This is a multiline text!
    ";
}

如果不处理,您可能会得到不必要的空格。为了去除它们,可以使用来自indoc包的 indoc! 宏来移除所有缩进: https://github.com/dtolnay/indoc


-2

在Rust中,有两种编写多行字符串的方式会产生不同的结果。根据你想要实现的目标,你应该仔细选择它们之间的区别。

方法1:悬挂空格

如果以"开头的字符串包含一个文字换行符,Rust编译器将“吞噬”该行中最后一个非空白字符和下一行第一个非空白字符之间的所有空格,并用单个替换它们。

例如:

fn test() {
    println!("{}", "hello  
    world");
}

无论在“hello”后面有多少个文字(零个或一百个)出现,上述代码的输出始终为“hello world”。
方法2:反斜杠换行
这是完全相反的。在此模式下,第一行中所有字面上的“\”之前的空格都会被保留,并且下一行的所有后续空格也会被保留。
例如:
fn test() {
    println!("{}", "hello  \
    world");
}

在这个例子中,输出是hello world
此外,正如另一个答案中提到的那样,Rust有“原始字面量”字符串,但它们不在本讨论中,因为在Rust中(与其他一些需要使用原始字符串的语言不同),支持带引号内容中的文字换行而没有限制,就像我们上面看到的一样。

10
当第一行以反斜杠结束时,Rust编译器将从第二行中删除空格。没有反斜杠的换行符将保留为字符串中的换行符。这是不正确的。 - Yves Dorfsman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接