Rust 中的多行字符串,保留前导空格

Multi-line string in Rust with preserved leading whitespace

在某些语言中可以写出这样的东西:

val some_string =
  """First line.
    | Second line, with leading space."""

也就是说,一个多行字符串,其中所有前导 space 都被删除了一个点,但没有进一步。这可以通过编写在 Rust 中模仿:

let some_string = 
    "First line.\n \
     Second line, with leading space.";

但是,这失去了更接近实际输出的好处。在 Rust 中有没有一种方法可以编写类似于示例伪代码的东西,保留(一些)前导 whitespace?

不,这是不可能的(v1.3,而且可能会持续很长时间)。

但是,通常需要人类可读的多行字符串文字是某种常量描述,例如 CLI 程序的用法字符串。你经常看到这样缩进的东西:

const USAGE: &'static str = "
Naval Fate.

Usage:
  ...
";

我想这没问题。如果你有很多这样的字符串或者一个非常大的字符串,你可以使用 include_str!.

Rust 1.7 的语言不支持它,但 Indoc 是一个可以做你想做的事情的过程宏。它代表“缩进文档”。它提供了一个名为 indoc!() 的宏,它采用多行字符串文字并取消缩进,因此最左边的非 space 字符位于第一列。

let some_string = indoc! {"
    First line.
     Second line, with leading space."
};

它也适用于原始字符串文字。

let some_string = indoc! {r#"
    First line.
     Second line, with leading space."#
};

两种情况下的结果都是"First line\n Second line, with leading space."

您可以使用引用 space \x20 的 ASCII 或引用 space \u{20}.

的 Unicode 开始要缩进的行
let some_string = 
    "First line.\n\
     \x20Second line, with leading space.\n\
     \u{20}Third line, with leading space.";

你只需要引用第一个space。

let some_string = 
    "First line.\n\
     \x20 Second line, with two leading spaces.\n\
     \u{20} Third line, with two leading spaces.";