我很难弄清楚Rust中的字符串语法是如何工作的。具体地说,我试图弄清楚如何使一个多行字符串。
所有的字符串字面量都可以分成几行;例如:
let string = "line one line two";
是一个两行字符串,与"line one\nline two"相同(当然也可以直接使用\n换行转义)。如果出于格式化的原因,你希望跨多行分割字符串,你可以使用\;例如:
"line one\nline two"
\n
\
let string = "one line \ written over \ several";
与"one line written over several"相同。
"one line written over several"
如果你想在字符串中添加换行符,你可以在\之前添加它们:
let string = "multiple\n\ lines\n\ with\n\ indentation";
它与"multiple\nlines\nwith\nindentation";相同
"multiple\nlines\nwith\nindentation";
如果你想做一些更长的事情,可能包括也可能不包括引号,反斜杠等,使用原始字符串文字表示法:
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##"# "###;
输出:
#version 330 in vec4 v_color; out vec4 color; void main() { color = v_color; };
游乐场链接 .
休恩的回答是正确的,但如果缩进让你感到困扰,可以考虑使用Indoc,这是一个用于缩进多行字符串的程序宏。它代表“缩进文件”;它提供了一个名为indoc!()的宏,该宏接受一个多行字符串字面值并取消缩进,使最左边的非空格字符位于第一列。
indoc!()
let s = indoc! {" line one line two "};
结果是"line one\nline two\n"。
"line one\nline two\n"
空白相对于文档中最左边的非空格字符被保留,因此下面的第二行相对于第一行有缩进的3个空格:
结果是"line one\n line two\n"。
"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
如果您想在不使用外部板条箱的情况下对多行字符串中的空格进行细粒度控制,可以执行以下操作。例子来自我自己的项目。
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
\x20\x20\x20\x20