Rust MemWriter返回指向Buffer的指针

时间:2014-09-04 08:28:00

标签: rust lifetime

我希望有一个函数使用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
  }
}

1 个答案:

答案 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)
  }
}