2014-09-04 106 views
0

我想要一個函數使用MemWriter來寫入一些字節,然後返回一個指向緩衝區的指針。在這種情況下,我很難理解如何使用生命週期。我如何使下面的代碼工作,我應該閱讀什麼來彌補我在這方面的知識差距?Rust MemWriter返回指向Buffer的指針

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

'Request'類型的定義是什麼? – huon 2014-09-04 08:52:30

+0

你不使用'self'這個方法嗎? – Levans 2014-09-04 08:55:33

+0

我已編輯將其中的定義。 – Upio 2014-09-04 08:55:36

回答

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 
    } 
} 

或者,如弗拉基米爾Matveev在評論中指出的那樣,你可以簡單地返回VecVec已經是一個安全管理堆內存的容器,直接返回它應該在大多數情況下對你有好處,並且這樣可以避免任何生命期問題。

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) 
    } 
} 
+0

編碼是我自己編造的特質。你可以忽略它,因爲它對我的問題並不重要。也許我應該重新命名它......我想我可以在堆上分配內存,並讓它出現在函數調用之外。我如何用MemWriter來做到這一點?我不想在請求中存儲緩衝區。 – Upio 2014-09-04 09:28:40

+0

@Upio看到我的編輯。 – Levans 2014-09-04 09:36:20

+0

你忘記了更新你如何存儲'buf'?你把它放在'self'中。我如何將解包的內容存儲在一個盒子裏? – Upio 2014-09-04 09:43:36