使用迭代器接口麻烦链接选项和结构字段

问题描述

我正在尝试使以下代码起作用:

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());