我想打印用逗号分隔的向量中的每个项目。您可以使用数字索引:
for i in 0..vec.len() {
print!("{}", vec[i]);
if i < vec.len() - 1 {
print!(", ");
}
}
但是,如果你只有Iterator
怎么办?你需要特别处理第一个或最后一个值,或者创建一个自定义迭代器,这似乎很多工作。
在Rust中有一种更清晰的惯用方式吗?
答案 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