选择换行在多行字符串文字中的位置

时间:2015-08-04 02:51:16

标签: rust

如果我创建以下多行字符串文字:

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");

这两个人都觉得有点笨重,虽然不是很糟糕。只是想知道是否有更清洁的方式?

3 个答案:

答案 0 :(得分:2)

Indoc是一个程序宏,可以执行您想要的操作。它代表“缩进文档”。它提供了一个名为indoc!()的宏,它接受多行字符串文字并取消缩进,使最左边的非空格字符位于第一列。

let lit = indoc!("A -> B
                  C -> D
                  E -> F");

根据您的要求,结果为"A -> B\nC -> D\nE -> F"

如果您愿意,可以使用几种相同的方法来格式化相同的内容,因此请选择您喜欢的方法。以下两者都会产生与上面相同的字符串。内容可以根据需要缩进 - 它不必是4个空格。

let lit = indoc!("
    A -> B
    C -> D
    E -> F");

let lit = indoc!(
    "A -> B
     C -> D
     E -> F");

相对于文档中最左边的非空格字符保留空格,因此以下内容在“C”之前保留2个空格:

let lit = indoc!(
     "A -> B
        C -> D
      E -> F");

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

答案 1 :(得分: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进行测试。

答案 2 :(得分: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");