2014-12-04 26 views
2

我嘗試以下操作:鏽上一場比賽表現的RHS創建AB「串」出一個字符串的

enum Payload { 
    Text(String) 
} 

struct Message { 
    payload: Payload 
} 

impl Message { 
    fn snd (self) { 

     let my_msg = match self.payload { 
      Payload::Text(s) => s.into_bytes().as_slice() // error here! 
     }; 
     println!("silly example: {}", my_msg); 
    } 
} 

fn main() { 
    let str = "hi".to_string(); 
    let pyld = Payload::Text(str); 
    let msg = Message{payload: pyld}; 
    msg.snd(); 
} 

,但只有這樣,我得到以下錯誤:

<anon>:13:33: 13:47 error: borrowed value does not live long enough 
<anon>:13    Payload::Text(s) => s.into_bytes().as_slice() 

我的問題:有沒有在匹配語句中給出分片值的方法,而不是在println!語句中?

你可以找到筆here

回答

2

.into_bytes()消耗s併產生Vec<u8>。它不存儲在任何地方,因此立即超出範圍。

你已經在那個上調用了.as_slice(),它生成&[u8],該對象的引用。然而,正如所述,它立即超出了範圍,所以「借來的價值活不夠長」。

的解決方案是不消耗所述有效載荷在任何的這一點,但採取引用一路:

let my_msg = match self.payload { 
    Payload::Text(ref s) => s.as_bytes(), 
}; 

ref s代替s意味着需要向Strings的引用類型的&String而不是String),然後我們使用as_bytes(&self) -> &[u8]而不是into_bytes(self) -> Vec<u8>