我有一个简单的结构,它定义了要通过网络发送的某种消息。
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()
}
}是的,这种类型随着更多链式迭代器的增加而不断增长,这有点遗憾。
但是,当我试图运行它时,我会得到两个编译器错误。
cannot return value referencing temporary value
returns a value referencing data owned by the current function. rustc(E0515)我想我对铁锈的所有权制度不够精通
发布于 2020-05-17 15:29:05
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()
}警告:每当您转换为字节时,请确认是否需要小字节/大端字节,并且所有字节都遵循相同的endian .
。
https://stackoverflow.com/questions/61853531
复制相似问题