首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在锈蚀中返回链式迭代器

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

Stack Overflow用户
提问于 2020-05-17 14:36:03
回答 1查看 676关注 0票数 0

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

代码语言:javascript
复制
struct Message {
    message_type: u32,
    user_id: u32,
    message: Vec<u8>,
}

在其他地方,我想把它序列化成一个简单的字节序列。所以我为消息的字节定义了迭代器,如下所示:

代码语言:javascript
复制
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()
    }
}

是的,这种类型随着更多链式迭代器的增加而不断增长,这有点遗憾。

但是,当我试图运行它时,我会得到两个编译器错误。

代码语言:javascript
复制
cannot return value referencing temporary value

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

我想我对铁锈的所有权制度不够精通

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-17 15:29:05

to_be_bytes()函数返回存储在堆栈中的数组是导致锈迹借用检查程序抱怨的问题。代码试图为堆栈上分配的对象创建一个迭代器,而这个迭代器比对象更有效。

代码语言:javascript
复制
self.message_type.to_be_bytes()

例如:

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

有几种方法可以解决这个问题。使iter和最终转换为字节都在同一个函数中。

代码语言:javascript
复制
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

警告:每当您转换为字节时,请确认是否需要小字节/大端字节,并且所有字节都遵循相同的endian .

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61853531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档