多行字符串文字的语法是什么?


Answers:


173

所有字符串文字都可以分成几行。例如:

let string = "line one
line two";

是两行字符串,与之相同"line one\nline two"(当然也可以\n直接使用换行符转义)。如果出于格式化原因只想在多行中中断一个字符串,则可以使用\;来换行并以空格开头。例如:

let string = "one line \
    written over \
    several";

与相同"one line written over several"

如果您想在字符串中使用换行符,可以在\:之前添加换行符:

let string = "multiple\n\
              lines\n\
              with\n\
              indentation";

和...一样 "multiple\nlines\nwith\nindentation";


2
如果只是可读性的问题,我想补充的concat!()宏来完成给定的选项(doc.rust-lang.org/std/macro.concat.html
hakononakani

82

如果您想做更长的时间,可能包含或不包含引号,反斜杠等,请使用原始字符串文字符号

let shader = r#"
    #version 330

    in vec4 v_color;
    out vec4 color;

    void main() {
        color = v_color;
    };
"#;

如果字符串中包含双引号和哈希符号序列,则可以将任意数量的哈希表示为定界符:

let crazy_raw_string = r###"
    My fingers #"
    can#"#t stop "#"" hitting
    hash##"#
"###;

但是...如果您不希望在结果中使用换行符,则只需要转义换行符,而原始字符串对此无济于事。
poolie

如果您不关心换行符(例如,当您嵌入诸如着色器和内核之类的与换行符无关的代码时),或者您暗示了原始字符串,那么原始字符串只会阻止您在每行末尾添加“ \”到实际需要换行符时。它只是使嵌入您可能要编辑的代码变得更加容易,而不必在每行末尾打上“ \”。就这样。
c0g

1
如果您想要(或不介意)结果字符串中的换行符,则用双引号括起来的普通字符串会做得很好,如其他示例所示。如果要避免换行,则原始字符串不好。它们仅在文本中包含引号,反斜杠等时才真正有用-嵌入式源中可能会发生这种情况。
poolie

2
我知道您现在所得到的,而且您绝对正确。
c0g

1
这将有助于显示打印这些字符串的输出。从答案本身,我无法知道换行符将如何处理以及如何处理缩进。
bluenote10

48

Huon的答案是正确的,但是如果缩进困扰您,请考虑使用Indoc,它是缩进多行字符串的程序宏。它代表“缩进文档”。它提供了一个名为的宏indoc!(),该宏采用多行字符串文字并将其缩进,因此最左边的非空格字符在第一列中。

let s = indoc! {"
    line one
    line two
"};

结果是"line one\nline two\n"

相对于文档中最左边的非空格字符保留空白,因此以下内容相对于第一行将第二行缩进了3个空格:

let s = indoc! {"
    line one
       line two
"};

结果是"line one\n line two\n"


8

如果您想缩进代码中的多行文字:

let s = "first line\n\
    second line\n\
    third line";

println!("Multiline text goes next:\n{}", s);

结果将如下所示:

Multiline text goes next:
first line
second line
third line

请使用散文明确指出哪段代码对此行为很重要。
Shepmaster

现在,这似乎并没有在接受的答案中添加任何新内容,它指出:可以使用\n换行符转义,可以使用来转义换行符和前导空格{backslash}。(看起来很难在注释中输入代码中的反斜杠。)
Shepmaster

2
此注释建议一种将已接受答案中的两点结合起来的方法:如何生成多行字符串,在代码中以多行形式编写,但是出于风格或易读性的原因,同时允许它自己的代码缩进形式,而该缩进形式不以最终字符串结尾。在文本中并没有非常清楚地说明它,但这是一个常见的用例,因此是一个有价值的建议。(请参阅dtolnay的答案以获取相关的木箱版本。)
拿督
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.