问题描述
我正在尝试使以下代码起作用:
struct IntHolder {
ints: Vec<i32>,}
impl IntHolder {
fn special_int(&self) -> Option<i32> {
return None;
}
fn all_ints(&self) -> impl Iterator<Item=&i32> {
return self.special_int().iter().chain(self.ints.iter());
}
}
fn main() {
let tst = IntHolder{ints: vec![0,1,2]};
for o in tst.all_ints() {
println!("{}",o)
}
}
但我收到此错误:
|
10 | return self.special_int().iter().chain(self.ints.iter());
| ------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| returns a value referencing data owned by the current function
| temporary value created here
奇怪的是,如果我将函数调用更改为内联 None
而不是调用返回选项的函数,它会起作用:
struct IntHolder {
ints: Vec<i32>,}
impl IntHolder {
fn special_int(&self) -> Option<i32> {
return None;
}
fn all_ints(&self) -> impl Iterator<Item=&i32> {
return None.iter().chain(self.ints.iter());
}
}
fn main() {
let tst = IntHolder{ints: vec![0,o)
}
}
有谁知道如何进行这项工作,或者为什么只有当我调用一个函数来生成选项时它才会中断?
(这是用来说明我遇到的问题的玩具代码。在我的实际代码中,我有一个包含对象向量的结构,有时还有一个可以从其他字段计算的特殊对象。我想要返回一个迭代器,如果可以计算它,它会遍历特殊对象,然后遍历向量中的所有对象。如果可以,我还想避免必须进行堆分配。)
解决方法
问题在于 iter
获取对该值的引用而不是使用它,返回一个引用属于该函数的值的迭代器。
尝试改用 into_iter()
:
return self.special_int().into_iter().chain(self.ints.iter());