为什么多行字符串会在开头跳过预期的空格?

Why do multiline strings skip intended whitespace at the beginning?

我有一些带有预期空格的多行字符串。对于其中一些,删除了一些空格:

const WORKING: &str = "\
┌─┬┐
│ ││
╞═╪╡
│ ││
├─┼┤
├─┼┤
│ ││
└─┴┘
";

const NON_WORKING: &str = "\
  ╷ 
  │ 
╶─┼╴
  │ 
╶─┼╴
╶─┼╴
  │ 
  ╵ 
";

pub fn main() {
    println!("{}", WORKING);
    println!("{}", NON_WORKING);
}

它删除了非工作行开头的一些空格。打印:

╷ 
  │ 
╶─┼╴
  │ 
╶─┼╴
╶─┼╴
  │ 
  ╵ 

我觉得要处理\的使用,但是不知道在"[=24=之后的行不开始怎么解决]

Playground

Rust 会自动删除预期的空格,因为长字符串通常像这样分成多行,空格仅用于格式化目的。

您可以使用 raw strings 来禁用此行为。请注意开头和结尾的额外 r 和自定义分隔符 #

const NON_WORKING: &str = r#"
  ╷ 
  │ 
╶─┼╴
  │ 
╶─┼╴
╶─┼╴
  │ 
  ╵ 
"#;

我自己没有尝试过,但我听说 the indoc crate 旨在帮助编写包含缩进的多行字符串文字。它从所有行中平等地删除前导空格,而不是 \ 从每一行中独立删除前导空格的行为。

Using indoc

use indoc::indoc;

fn main() {
    let testing = indoc! {"
        def hello():
            print('Hello, world!')

        hello()
    "};
    let expected = "def hello():\n    print('Hello, world!')\n\nhello()\n";
    assert_eq!(testing, expected);
}

我终于使用普通 str 并删除了初始 \n:

let WORKING: &str ="
 ── 
    
 ── 
    
 ── 
 ── 
    
 ── ".trim_start_matches("\n")