如何在锈中返回链式迭代器

问题描述 投票:0回答:1

我有一个简单的结构,用于定义要通过网络发送的某种消息。

struct Message {
    message_type: u32,
    user_id: u32,
    message: Vec<u8>,
}

还有我想将其序列化为一个简单的字节序列。因此,我为消息的字节定义了迭代器,如下所示:

impl Message {
    fn iter(&self) -> std::iter::Chain<std::iter::Chain<std::slice::Iter<'_, u8>, std::slice::Iter<'_, u8>>, std::slice::Iter<'_, u8>> {
        self.message_type
            .to_be_bytes()
            .iter()
            .chain(self.user_id.to_be_bytes().iter())
            .chain(self.message.iter())
    }

    fn data(&self) -> Vec<u8> {
        self.iter().cloned().collect()
    }
}

[[是的,类型随着越来越多的链式迭代器而不断增长,这实在令人遗憾

但是我尝试运行它时遇到2个编译器错误

cannot return value referencing temporary value returns a value referencing data owned by the current function. rustc(E0515)

猜猜我对铁锈的所有权制度还不足够精通
rust iterator ownership borrowing
1个回答
0
投票
为什么生锈借阅检查器抱怨的问题是因为to_be_bytes()函数返回一个存储在堆栈中的数组。该代码正在尝试为在堆栈上分配的对象创建迭代器,而该迭代器使该对象失效。

self.message_type.to_be_bytes()

例如:这将在堆栈上创建一个数组,并且.iter()仅在此对象存在的情况下才有效。 

有几种解决方法。在同一函数中将iter最终转换为字节。

fn data(&self) -> Vec<u8> { self.message_type .to_be_bytes() .iter() .chain(self.user_id.to_be_bytes().iter()) .chain(self.message.iter()).map(|x| *x).collect() }

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=129af6e7da3d1e3a9454fffbb124e170

警告:每当转换为字节时,请确认是否要使用小端/大端,并且所有字节都遵循相同的字节序。
© www.soinside.com 2019 - 2024. All rights reserved.