62

是否可以编写类似的内容:

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

5 回答 5

48

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

于 2013-03-07T08:54:45.063 回答
37

另一种方法是使用原始字符串文字

原始字符串文字不处理任何转义。它们以字符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
于 2015-08-29T20:01:57.470 回答
14

如果您想避免使用换行符和多余的空格,可以使用concat!宏。它在编译时连接字符串文字。

let my_string = concat!(
    "Testing for new lines ",
    "might work like this?",
);

assert_eq!(my_string, "Testing for new lines might work like this?");

带有反斜杠的已接受答案也删除了多余的空格。

于 2019-10-01T16:23:18.570 回答
2

Rust 中的每一行都是多行。

但是,如果您的文本中有缩进,例如:

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

你会得到不必要的空间。要删除它们,您可以使用crate 中的indoc!indoc来删除所有缩进:https ://github.com/dtolnay/indoc

于 2020-04-27T08:58:10.547 回答
1

在 Rust 中有两种编写多行字符串的方法,它们会产生不同的结果。您应该根据您要完成的任务谨慎地在它们之间进行选择。

方法一:悬空空白

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

例子:

fn test() {
    println!("{}", "hello  
    world");
}

无论之后出现多少文字(空格)字符(零或一百)hello,上面的输出将始终为hello world.

方法2:反斜杠换行

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

例子:

fn test() {
    println!("{}", "hello  \
    world");
}

在此示例中,输出为hello world

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

于 2017-10-29T22:00:55.230 回答