我希望有一个函数使用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
}
}
答案 0 :(得分:2)
您无法返回对无处存储的缓冲区的引用
您需要在内部存储缓冲区,或者您将尝试返回对已释放内存的引用,这对于生命周期检查程序是危险的,因此是禁止的。
例如:
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)
}
}