如何在Rust中编写多行字符串?

如何在Rust中编写多行字符串?,rust,Rust,有没有可能写出这样的内容: fn main() { let my_string: &str = "Testing for new lines \ might work like this?"; } 如果我读的是正确的,那么看起来应该行得通。语言ref声明支持\n等(作为常用转义,用于在字符串中插入换行符),以及“其他转义”,包括LF、CR和HT。另一种方法是使用: 原始字符串文本不处理任何转义。他们从 字符U+0072(r)

有没有可能写出这样的内容:

fn main() {
    let my_string: &str = "Testing for new lines \
                           might work like this?";
}

如果我读的是正确的,那么看起来应该行得通。语言ref声明支持
\n
等(作为常用转义,用于在字符串中插入换行符),以及“其他转义”,包括LF、CR和HT。

另一种方法是使用:

原始字符串文本不处理任何转义。他们从 字符
U+0072
r
),后跟零个或多个字符
U+0023
#
)和一个
U+0022
(双引号)字符。原始字符串主体可以 包含任何Unicode字符序列,并且仅由 另一个
U+0022
(双引号)字符,后跟相同的数字 开头前的
U+0023
(#)个字符的数量
U+0022
(双引号)字符

原始字符串正文中包含的所有Unicode字符表示 字符
U+0022
(双引号)(后面跟着的除外 至少由用于启动的
U+0023
#
)个字符组成 原始字符串文本)或
U+005C
\
)没有任何特殊含义

字符串文字的示例:

"foo"; r"foo";                     // foo
"\"foo\""; r#""foo""#;             // "foo"

"foo #\"# bar";
r##"foo #"# bar"##;                // foo #"# bar

"\x52"; "R"; r"R";                 // R
"\\x52"; r"\x52";                  // \x52

有两种在Rust中编写多行字符串的方法,它们的结果不同。你应该根据你想要完成的目标谨慎地选择它们

方法1:悬空空白

如果以
开头的字符串包含文字换行符,Rust编译器将“吞噬”该行最后一个非空白字符和下一行第一个非空白字符之间的所有空白,并用单个
替换它们

例如:

fn test() {
    println!("{}", "hello  
    world");
}
fn test() {
    println!("{}", "hello  \
    world");
}
无论在
hello
之后出现多少个文本
(空白)字符(零或一百),上述字符的输出将始终是
hello world

方法2:反斜杠换行

恰恰相反。在这种模式下,第一行文字
\
前的所有空格都会保留,下一行的所有后续空格也会保留

例如:

fn test() {
    println!("{}", "hello  
    world");
}
fn test() {
    println!("{}", "hello  \
    world");
}
在本例中,输出为
hello world


另外,正如在另一个答案中提到的,Rust有“原始文字”字符串,但它们不像Rust那样进入讨论(与其他一些需要使用原始字符串的语言不同)如上所述,在引用内容中不受限制地支持文字换行。

如果希望避免使用换行符和额外空格,可以使用宏。它在编译时连接字符串文字

让我的字符串=concat(
“新线测试”,
“可能是这样吗?”,
);
assert_eq!(我的_字符串“测试新行是否可以这样工作?”);

也删除了多余的空格。

每一行都是生锈的多行。

但如果文本中有缩进,如:

fn my_func() {
    const MY_CONST: &str = "\
    Hi!
    This is a multiline text!
    ";
}

但是你会得到不必要的空格。要删除它们,你可以使用
indoc!
crater中的
macros来删除所有缩进:

Lee是正确的。反斜杠可以用来将字符串常量扩展到多行。第二行省略了前导空格。谢谢-我的原始代码有一个不同的错误,导致了me认为“\”不起作用。对,但不是必需的。Rust中的每个字符串文字都可以是多行的。这是不正确的。当第一行以反斜杠结尾时,Rust复制程序将删除第二行的空格。没有反斜杠的换行符将作为字符串中的换行符保留。可能重复:此问题n比复制早两年。可能是我见过的最好的解决方案。谢谢。