选择多行字符串字面量中换行符的位置

8
如果我创建以下多行字符串字面量:
let lit = "A -> B
           C -> D
           E -> F";

它的输出结果如下:

A -> B
          C -> D
          E -> F

毫不意外。但是,如果我尝试这样做:
let lit = "A -> B\
           C -> D\
           E -> F";

我明白:

A -> BC -> DE -> F

我要得到的是这个:

我想得到的是:

A -> B
C -> D
E -> F

但这是我想出来的最好的东西:
let lit = "A -> B\n\
           C -> D\n\
           E -> F";

也许是这样的情况:
let lit = vec!["A -> B", "C -> D", "E -> F"].connect("\n");

这两种方式都有点笨重,虽然不是很糟糕。只是想知道是否有更简洁的方法?


代码审查更适合这个。 - Evan Carslake
4
@EvanCarslake 这段代码完全是假设的,超出了 Code Review 的范围。请参阅 Stack Overflow 用户的 Code Review 指南 - Mathieu Guindon
@Mat'sMug 我错了。不过我无法帮助你。 - Evan Carslake
3个回答

3

Indoc 是一个可以帮助你实现想要的功能的过程宏。它的名称代表“缩进文档”。它提供了一个名为 indoc!() 的宏,该宏接受多行字符串字面值并将其取消缩进,以便最左侧的非空格字符位于第一列。

let lit = indoc! {"
    A -> B
    C -> D
    E -> F"
};

你所要求的结果是"A -> B\nC -> D\nE -> F"
相对于文档中最左边的非空格字符,空格被保留。因此,下面的内容保留了在“C”之前的2个空格:
let lit = indoc! {"
    A -> B
      C -> D
    E -> F"
};

结果是"A -> B\n C -> D\nE -> F"

0

我看到另外三种可能的解决方案:

1)去掉空格:

let lit = "A -> B
C -> D
E -> F";

这样做会使您的代码显示不整齐。您可以通过以下方式恢复:

2)去掉空格,将所有内容下移一行,并转义回车符。

let lit = "\
A -> B
C -> D
E -> F";

我会在注释中解释 "\" 的作用,因为否则它不明显。

3)将这两个解决方案结合起来:

let lit = 
"A -> B
C -> D
E -> F";

你可以在Ideone上进行测试。

1
我起初使用了1),但问题是它在缩进代码时看起来相当糟糕。 - anderspitman
@ChrisMorgan 谢谢。 - user2509848
@anderspitman:这不是缩进代码和多行的通用问题吗?我记得 Python 也有类似的问题... - Matthieu M.
你可以在赋值中使用空格,然后替换掉任何行首的空格。当然,这样做会稍微低效一些。 - tripleee

0

主要是为了练习,我用以下代码模仿了Python的join语法:

trait CanJoin {
    fn join(&self, in_strings: Vec<&str>) -> String;
}

impl CanJoin for str {
    fn join(&self, in_strings: Vec<&str>) -> String {
        in_strings.connect(self)
    }
}

fn main() {
    let vector = vec!["A -> B", "B -> C", "C -> D"];
    let joined = "\n".join(vector);
}

或者作为宏:

macro_rules! join_lines {
    ($($x:tt)*) => {
        {
            vec![$($x)*].connect("\n")
        }
    }
}

let joined = join_lines!("A -> B", "B -> C", "C -> D");

在这里使用向量有些过头了。["a", "b"].connect("-")就足够了。 - Shepmaster
1
请注意,connect正在更名join - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接