在Rust中,在容器中的每个值之间打印内容的最佳方法是什么?

时间:2014-10-30 03:18:08

标签: rust

我想打印用逗号分隔的向量中的每个项目。您可以使用数字索引:

for i in 0..vec.len() {
    print!("{}", vec[i]);
    if i < vec.len() - 1 {
        print!(", ");
    }
}

但是,如果你只有Iterator怎么办?你需要特别处理第一个或最后一个值,或者创建一个自定义迭代器,这似乎很多工作。

在Rust中有一种更清晰的惯用方式吗?

4 个答案:

答案 0 :(得分:8)

如果你想避免使用变量来检查元素是否是第一个,你可以使用迭代器的.take().skip()方法:

for e in vec.iter().take(1) {
    print!("{}", e);
}
for e in vec.iter().skip(1) {
    print!(", {}", e);
}

或压缩所有折叠:

vec.iter().fold(true, |first, elem| {
    if !first { print(", "); }
    print(elem);
    false
});

答案 1 :(得分:4)

let first = true;
for item in iterator {
    if !first {
        print(", ");
    }
    print(item);
    first = false;
}

答案 2 :(得分:1)

你可以为第一个元素做一些特殊的事情,然后对所有后续的元素进行相同的处理:

let mut iter = vec.iter();
if let Some(item) = iter.next() {
    print!("{}", item);

    for item in iter {
        print!("<separator>{}", item);        
    }
}

如果您使用Itertools::format,则更容易:

println!("{}", vec.iter().format("<separator>"));

答案 3 :(得分:1)

另一种方法:

fn main() {
   let a = vec!["May", "June"];
   for (n, s) in a.iter().enumerate() {
      if n > 0 {
         print!(",");
      }
      print!("{}", s);
   }
}

https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.enumerate