【发布时间】:2015-06-11 13:32:49
【问题描述】:
我很难弄清楚字符串语法在 Rust 中是如何工作的。具体来说,我正在尝试弄清楚如何制作多行字符串。
【问题讨论】:
我很难弄清楚字符串语法在 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!() 宏来完成给定的选项 (doc.rust-lang.org/std/macro.concat.html)
如果您想做一些更长的事情,可能包含也可能不包含引号、反斜杠等,请使用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##"#
"###;
【讨论】:
Huon's answer 是正确的,但如果缩进让您感到困扰,请考虑使用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"。
【讨论】:
如果您想在代码中缩进多行文本:
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} 的空格。 (在注释中的代码中输入反斜杠非常困难,看来。)
indoc! 保留缩进。
如果您想在不使用外部 crate 的情况下对带有换行符的多行字符串中的空格进行精细控制,您可以执行以下操作。示例取自我自己的项目。
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 效果一样【讨论】: