【问题标题】:How do I write a multi-line string in Rust? [duplicate]如何在 Rust 中编写多行字符串? [复制]
【发布时间】:2013-03-07 07:14:09
【问题描述】:

是否可以这样写:

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

【问题讨论】:

标签: rust


【解决方案1】:

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

【讨论】:

  • 李是正确的。反斜杠可用于将字符串常量扩展到多行。第二行省略了前导空格。
  • 谢谢 - 我的原始代码有一个不同的错误,让我相信 '\' 不起作用。
【解决方案2】:

另一种方法是使用raw string literal

原始字符串文字不处理任何转义。他们从 字符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 中的每个字符串文字都可以是多行的。
【解决方案3】:

如果您想避免使用换行符和多余的空格,可以使用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?");

accepted answer with the backslash 也会删除多余的空格。

【讨论】:

  • 可能是我见过的最好的解决方案。谢谢。
【解决方案4】:

Rust 中的每一行都是多行。

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

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

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

【讨论】:

    【解决方案5】:

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

    方法一:悬空空格

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

    例子:

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

    无论hello之后出现多少文字(空格)字符(零或一百),上面的输出总是hello world

    方法二:反斜杠换行

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

    例子:

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

    在本例中,输出为hello world

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

    【讨论】:

    • 这是不正确的。当第一行以反斜杠结束时,Rust 编译器将删除第二行中的空格。没有反斜杠的换行符将作为换行符保留在字符串中。
    猜你喜欢
    • 2014-05-20
    • 2011-12-17
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2018-02-10
    • 1970-01-01
    • 2019-05-05
    相关资源
    最近更新 更多