2014-12-04 2 views
2

나는 시도하고 다음

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() 

내 질문 : 성명 대신 성명서에 슬라이스 값을 부여하는 방법이 있습니까?

당신은 here

답변

2

.into_bytes()s을 소비하고 Vec<u8>을 생산 펜을 찾을 수 있습니다. 어디에도 저장되지 않으므로 즉시 범위를 벗어납니다.

을 호출 했으므로 그 객체에 대한 참조는 &[u8]입니다. 그러나 명시된 바와 같이 즉각적인 범위를 벗어나기 때문에 "빌린 가치는 충분히 오래 살지 않습니다."

용액을 참조 끝까지 취할 그러나이 중 어느 하나에 페이로드를 소비하지 않다 :

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

대신 sref s 그것이 String (s 참조를 형인 걸리는 것을 의미 String 대신 &String)을 입력 한 다음 into_bytes(self) -> Vec<u8> 대신 as_bytes(&self) -> &[u8]을 사용합니다.