【发布时间】:2019-12-25 22:31:25
【问题描述】:
我有一个递归调用的通用函数,它可以接受可以转换为迭代器的参数。
我想将作为参数传递的迭代器与从函数本地集合创建的迭代器链接起来。这个想法是,在多次调用递归函数后,会创建一个迭代器,该迭代器能够迭代位于其各自堆栈帧中的所有集合。
fn func_taking_iter<'a, I>(vals: I) -> ()
where
I: IntoIterator<Item = &'a u32>,
I::IntoIter: Clone,
{
let vals = vals.into_iter();
let mut new_val: [u32; 1] = [0u32; 1];
for x in vals.clone() {
new_val[0] = *x;
}
new_val[0] += 1u32;
if new_val[0] == 10u32 {
for x in vals {
println!("Value {}", *x);
}
return;
}
let res = vals.into_iter().chain(new_val.into_iter());
func_taking_iter(res);
}
fn main() {
let first_val = [0u32; 1];
func_taking_iter(first_val.iter());
}
不幸的是,当我尝试编译代码时出现以下错误。
error[E0597]: `new_val` does not live long enough
--> src\main.rs:20:38
|
1 | fn func_taking_iter<'a, I>(vals: I) -> ()
| -- lifetime `'a` defined here
...
20 | let res = vals.into_iter().chain(new_val.into_iter());
| -----------------------^^^^^^^-------------
| | |
| | borrowed value does not live long enough
| argument requires that `new_val` is borrowed for `'a`
...
23 | }
| - `new_val` dropped here while still borrowed
我在 Rust 方面没有太多经验,我被困在这里,但在我看来,这似乎不是一件不可能的事情......
编辑:改进了示例代码,由于 Stargateur 的 answer 中的提示,只有迭代器而不是整个集合被克隆
【问题讨论】:
标签: recursion rust iterator lifetime chain