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

String 多行字符串文字的语法是什么?,string,rust,String,Rust,我很难弄清楚字符串语法在Rust中是如何工作的。具体地说,我正在试图找出如何生成多行字符串。所有字符串文本都可以跨多行进行拆分;例如: let string = "line one line two"; let string = "one line \ written over \ several"; 是一个两行字符串,与“line one\nline two”相同(当然也可以直接使用\n换行符)。如果出于格式化的原因,希望在多行中打断字符串,可以使用\转义换行符和前导空格;

我很难弄清楚字符串语法在Rust中是如何工作的。具体地说,我正在试图找出如何生成多行字符串。

所有字符串文本都可以跨多行进行拆分;例如:

let string = "line one
line two";
let string = "one line \
    written over \
    several";
是一个两行字符串,与
“line one\nline two”
相同(当然也可以直接使用
\n
换行符)。如果出于格式化的原因,希望在多行中打断字符串,可以使用
\
转义换行符和前导空格;例如:

let string = "line one
line two";
let string = "one line \
    written over \
    several";
与“一行写在几行上”相同

如果要在字符串中添加换行符,可以将其添加到
\
之前:

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

“多行\n带\n齿”相同

如果您想做更长的事情,可能包括也可能不包括引号、反斜杠等,请使用:

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

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

是正确的,但是如果压痕困扰了你,考虑使用哪一个是缩进多行字符串的过程宏。它代表“缩进文档”。它提供了一个名为

indoc!()
接受多行字符串文字并取消缩进,使最左边的非空格字符位于第一列

let s = indoc! {"
    line one
    line two
"};
结果是
“第一行\n第二行\n”

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

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

如果要在代码中缩进多行文本,结果是“第一行\n第二行\n”

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

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

多行文字接下来:
一线
第二线
第三行

如果您想在不使用外部板条箱的情况下对带换行符的多行字符串中的空格进行精细控制,可以执行以下操作。例子取自我自己的项目

impl Display for OCPRecData {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        write!(f, "OCPRecData {{\n\
            \x20   msg: {:?}\n\
            \x20   device_name: {:?}\n\
            \x20   parent_device_name: {:?}\n\
        }}", self.msg, self.device_name, self.parent_device_name)
    }
}
  • \n\
    在每行代码的末尾,在适当的位置创建一个换行符,并丢弃这行代码中的更多空格
  • \x20
    (十六进制;十进制为32)是一个ASCII空格,是字符串此行中要保留的第一个空格的指示符
  • \x20\x20\x20\x20
    \x20
    具有相同的效果

但是。。。如果不想在结果中使用换行符,则只需转义换行符,而原始字符串对此没有帮助。如果您不关心换行符(例如,当您嵌入与换行符无关的代码(如着色器和内核),则原始字符串可以防止您在每行末尾添加“\”,或者,正如您所提到的,当实际需要换行时。它只是使嵌入您可能想要编辑的代码变得更容易,而不必为每行末尾的“\”而烦恼。仅此而已。如果您想要(或不介意)在结果字符串中添加换行符,则纯双引号字符串将非常适合,如其他示例所示。如果要避免换行,原始字符串是不好的。它们只有在文本中包含引号、反斜杠等时才有帮助,就像在嵌入式源代码中可能发生的那样。我知道你现在得到了什么,你完全正确。这将有助于显示打印这些字符串的输出。从答案本身,我无法判断换行符会发生什么,以及缩进是如何处理的。请使用散文明确说明哪些代码段对该行为很重要。目前,这似乎没有添加任何新内容,说明:可以使用
\n
换行符[…]您可以使用
{backslash}
转义换行符和前导空格。(似乎很难在注释中的代码中键入反斜杠。)该注释建议将公认答案中的两点结合起来:如何生成一个多行字符串,在代码中以多行形式书写,但同时,出于风格或易读性原因,允许在代码中获得自己的缩进,没有以最后一个字符串结尾的缩进。这在文本中并不是很清楚,但它是一个常见的用例,因此是一个有价值的建议。(关于此板条箱版本,请参见dtolnay的回答。)Re:Dato的评论:“关于此板条箱版本,请参见dtolnay的回答”:要清楚,与此处给出的示例不同,因为
indoc保留缩进。如果只是可读性的问题,我想添加
concat!()
macro来完成给定的选项()啊!非常感谢!我正要创建我自己的问题,特别是关于使用缩进实现多行字符串文字的最佳方法,这也很好地保留了代码缩进,这时我无意中发现了您的答案!作为参考,我创建了一个rust游乐场,其中列出了我提出的各种选项及其相对缺点: