Rust 带保留前导空格的生锈多行字符串

Rust 带保留前导空格的生锈多行字符串,rust,whitespace,pretty-print,Rust,Whitespace,Pretty Print,在某些语言中,可以编写此类内容: val some_string = """First line. | Second line, with leading space.""" 也就是说,一个多行字符串,其中所有前导空格都删除到某一点,但不再删除。这可以通过书写在Rust中模仿: let some_string = "First line.\n \ Second line, with leading space."; 然而,这失去了更接近实际输出的好处。有没有一

在某些语言中,可以编写此类内容:

val some_string =
  """First line.
    | Second line, with leading space."""
也就是说,一个多行字符串,其中所有前导空格都删除到某一点,但不再删除。这可以通过书写在Rust中模仿:

let some_string = 
    "First line.\n \
     Second line, with leading space.";
然而,这失去了更接近实际输出的好处。有没有一种方法可以像编写示例伪代码那样,保留(一些)前导空格?

不,这是不可能的(
v1.3
,而且可能需要很长时间)

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

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

Usage:
  ...
";

我想这没关系。如果您有很多这样的字符串或一个非常大的字符串,您可以使用。

从Rust 1.7开始,该语言不支持它,但它是一个过程宏,可以执行您想要的操作。它代表“缩进文档”。它提供了一个名为
indoc!()
接受多行字符串文字并取消缩进,使最左边的非空格字符位于第一列

让一些字符串=indoc!{"
第一行。
第二行,带前导空格。“
};
它也适用于原始字符串文本

让一些字符串=indoc!{r#”
第一行。
第二行,带前导空格。“#
};

两种情况下的结果都是“第一行\n第二行,带前导空格。”

您可以使用ASCII引号空格
\x20
或Unicode引号空格
\u{20}
开始要缩进的行

let some_string = 
    "First line.\n\
     \x20Second line, with leading space.\n\
     \u{20}Third line, with leading space.";
你只需要引用第一个空格

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

升级已创建的工具或库时,在堆栈溢出时声明从属关系是应该的。@Shepmaster为什么说“它是应该的”?谁期望的,为什么?你有关于它的元讨论的参考文献吗?我的观点是:虽然我不认为自我认同有什么坏处,但我不认为作者在链接到他们所创作或贡献的开源项目时会自我认同“这是预期的”,甚至不认为是当前准则的一部分。为了形成这一评估,我回顾了关于链接到外部资源主题的各种Meta StackExchange帖子。这一条似乎是最官方的:——它对这件事保持沉默,“独立性和客观性:记者应避免涉及经济利益或个人利益的话题,因为这些利益可能会给他们的报道带来偏见,或给人留下这种偏见的印象。如果记者可能有特定的财务或个人利益,则应披露该利益;“--我想提出一个问题:与当前环境(StackOverflow)有什么相似之处和不同之处?