微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。