除了Rust迭代器中的最后一项之外,如何重复克隆操作?
我经常看到我需要遍历一个范围并调用一个拥有其参数所有权的函数的模式。由于该函数拥有其参数的所有权,因此我必须克隆该值。例如:
let a = "hello".to_string();
for i in 0..10 {
print_me(a.clone());
}
fn print_me(s: String) {
println!("{}", s);
}
我想找到一种模式,在该模式中,除了最后一个调用之外,所有调用的值都被克隆,以防止冗余克隆。
最简单的方法是对循环索引添加显式检查:
for i in 0..10 {
if i == 9 {
print_me(a);
} else {
print_me(a.clone());
}
}
但是编译器无法理解模式并抱怨迭代期间移动的值。
我还试图建立一个确实克隆一个迭代器,并使用移动repeat_with(),chain()和once()而关闭cosumes值:
let iter = std::iter::repeat_with(|| a.clone())
.take(9)
.chain(std::iter::once(a))
实现这种模式的最简单方法是什么?
谢谢!
回答
作为替代解决方案,您可以通过跳出循环使编译器了解它实际上是最后一次迭代:
for i in 0..10 {
if i == 9 {
print_me(a);
break;
} else {
print_me(a.clone());
}
}