我很难弄清楚Rust语法中的字符串语法是如何工作的。具体来说,我试图找出如何制作多行字符串。
答案 0 :(得分:102)
所有字符串文字都可以分成几行,例如
let string = "line one
line two";
是一个双行字符串,与"line one\nline two"
相同(当然也可以直接使用\n
换行符)。如果您希望仅出于格式化原因而断开多行中的字符串,则可以使用\
转义换行符和前导空格,例如
let string = "one line \
written over \
several";
与"one line written over several"
相同。
答案 1 :(得分:45)
如果您想要做更长时间的事情,可能包括引号,反斜杠等,也可以不使用引号,反斜杠等,请使用raw string literal notation:
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##"#
"###;
答案 2 :(得分:33)
Huon's answer是正确的,但如果缩进困扰你,请考虑使用Indoc这是缩进多行字符串的过程宏。它代表“缩进文档”。它提供了一个名为indoc!()
的宏,它接受多行字符串文字并取消缩进,使最左边的非空格字符位于第一列。
let s = indoc!("
line one
line two");
结果为"line one\nline two"
。
如果您愿意,可以使用几种相同的方法来格式化相同的内容,因此请选择您喜欢的方法。以下两者都会产生与上面相同的字符串。内容可以根据需要缩进 - 它不必是特定数量的空格。
let s = indoc!(
"line one
line two");
let s = indoc!("line one
line two");
相对于文档中最左边的非空格字符保留空格,因此以下内容有两行相对于第一行缩进3个空格:
let s = indoc!("
line one
line two");
结果为"line one\n line two"
。
答案 3 :(得分:6)
如果您想缩进代码中的多行文本:
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
答案 4 :(得分:3)
如果您想对带换行符的多行字符串中的空格进行精细的控制,而无需使用外部包装箱,则可以进行以下操作。来自我自己项目的示例。
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)
}
}
结果
OCPRecData {
msg: Some("Hello World")
device_name: None
parent_device_name: None
}
\n\
在适当的位置创建一个换行符,并在此代码行中丢弃更多的空格\x20
(十六进制;十进制为32)是ASCII空间,是指示在此行的字符串中保留的第一个空格的指示符。\x20\x20\x20\x20
和\x20
具有相同的作用