我想让一个函数使用 MemWriter 写入一些字节,然后返回一个指向缓冲区的指针。在这种情况下,我很难理解如何使用生命周期。我将如何使下面的代码工作以及我应该阅读什么来填补我的知识空白?
struct Request<T: Encodable> {
id: i16,
e: T
}
impl <T: Encodable> Request<T> {
fn serialize<'s>(&'s self) -> io::IoResult<&'s Vec<u8>> {
let mut writer = io::MemWriter::new();
try!(writer.write_be_i16(0 as i16));
let buf = writer.unwrap();
let size = buf.len();
let result: io::IoResult<&Vec<u8>> = Ok(&buf);
result
}
}
最佳答案
您不能返回对无处存储的缓冲区的引用
您需要在内部存储缓冲区,否则您会尝试返回对已释放内存的引用,这是危险的,因此会被生命周期检查器禁止。
例如像这样:
struct Request<T: Encodable> {
buf: Vec<u8>
}
impl <T: Encodable> Request<T> {
fn serialize<'s>(&'s mut self) -> io::IoResult<&'s Vec<u8>> { //'
let mut writer = io::MemWriter::new();
try!(writer.write_be_i16(0 as i16));
self.buf = writer.unwrap();
let size = self.buf.len();
let result: io::IoResult<&Vec<u8>> = Ok(&self.buf);
result
}
}
或者,正如 Vladimir Matveev 在评论中指出的那样,您可以简单地返回 Vec
。 Vec
已经是一个安全地管理堆上内存的容器,在大多数情况下直接返回它应该对你有好处,这样你就可以避免任何生命周期问题。
impl <T: Encodable> Request<T> {
fn serialize(&mut self) -> io::IoResult<Vec<u8>> {
let mut writer = io::MemWriter::new();
try!(writer.write_be_i16(0 as i16));
let buf = writer.unwrap();
let size = buf.len();
Ok(buf)
}
}
关于Rust MemWriter 返回指向 Buffer 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25660689/