如果我创建以下多行字符串文字:
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");
这两个人都觉得有点笨重,虽然不是很糟糕。只是想知道是否有更清洁的方式?
答案 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");