我在学习Rust时遇到了一些困难,不知道字符串语法是如何工作的。具体来说,我正在尝试弄清如何创建多行字符串。
所有字符串文本都可以跨越多行;例如:
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";
相同。
concat!()
宏以完成给定的选项(https://doc.rust-lang.org/std/macro.concat.html)。 - hakononakanilet shader = r#"
#version 330
in vec4 v_color;
out vec4 color;
void main() {
color = v_color;
};
"#;
输出:
#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##"#
"###;
这将输出:
My fingers #"
can#"#t stop "#"" hitting
hash##"#
Huon's answer 是正确的,但如果缩进让你感到困扰,可以考虑使用 Indoc 这个工具,它是一个用于缩进多行字符串的过程宏。Indoc 代表 "Indented Document",它提供了一个名为 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"
。
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
(十六进制;10进制32)是ASCII空格,也是字符串中第一个要保留的空格的指示符。\x20\x20\x20\x20
和 \x20
具有相同的效果。如果您想在代码中缩进多行文本:
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
\n
换行符转义[...]您可以使用{backslash}
转义换行符和前导空格。(在代码注释中输入反斜杠非常困难。) - Shepmaster