为什么多行字符串会在开头跳过预期的空格?
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=之后的行不开始怎么解决]
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")
我有一些带有预期空格的多行字符串。对于其中一些,删除了一些空格:
const WORKING: &str = "\
┌─┬┐
│ ││
╞═╪╡
│ ││
├─┼┤
├─┼┤
│ ││
└─┴┘
";
const NON_WORKING: &str = "\
╷
│
╶─┼╴
│
╶─┼╴
╶─┼╴
│
╵
";
pub fn main() {
println!("{}", WORKING);
println!("{}", NON_WORKING);
}
它删除了非工作行开头的一些空格。打印:
╷
│
╶─┼╴
│
╶─┼╴
╶─┼╴
│
╵
我觉得要处理\
的使用,但是不知道在"
[=24=之后的行不开始怎么解决]
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")