2016-07-24 4 views
-2

String이 구조체의 "생성자"메서드 내부에서 생성 된 구조체에 Chars 반복자를 할당 할 수 있기를 바랍니다. 어떻게해야합니까?"충분히 오래 살지 않아서"Chars 반복자를 반환 할 수 없습니다.

코드 (run it) :

use std::str::Chars; 

fn main() { 
    let foo = Foo::new(); 
} 

struct Foo<'a> { 
    chars: Chars<'a> 
} 
impl<'a> Foo<'a> { 
    pub fn new() -> Self { 
     let s = "value".to_string(); 
     Foo { chars: s.chars() } 
    } 
} 

오류 :

error: `s` does not live long enough 
    --> <anon>:13:22 
13 |>   Foo { chars: s.chars() } 
    |>     ^
note: reference must be valid for the lifetime 'a as defined on the block at 11:25... 
    --> <anon>:11:26 
11 |>  pub fn new() -> Self { 
    |>      ^
note: ...but borrowed value is only valid for the block suffix following statement 0 at 12:36 
    --> <anon>:12:37 
12 |>   let s = "value".to_string(); 
    |>   

(내 실제 코드에서 생성자는 파일에서 텍스트를 읽습니다) 당신은 할 수 없습니다

+7

[** 84 개의 질문에 녹슬 었습니다 **] (http://stackoverflow.com/search?q=%5Brust%5D+%22does+not+live+long+enough%22+is%3Aq)와 정확한 문자열''오래 살지 않습니다'. 18k + 평판을 가진 스택 오버플로 사용자는 새로운 질문에 대한 좋은 예를 설정하기 위해 [질문하기 전에 수행 한 리서치를 보여 주어야합니다] (http://meta.stackoverflow.com/q/261592/155423)해야합니다. 사이트에. – Shepmaster

+1

Shepmaster가 말했듯이이 오류 메시지를 설명하는 질문은 이미 84 개 있습니다. 귀하의 상황에 대해 그들이 부족한 세부 사항을 설명 할 수 있도록 답변을 귀하의 사례에 맞게 조정할 수 있습니다. –

답변

5

. Chars은 문자열의 소유권을 가져 오지 않으므로 Foo::new을 벗어나면 더 이상 문자열이 존재하지 않습니다. 문자열 자체를 저장해야합니다. Chars은 실제로 사이트에서 사용하기위한 작은 유틸리티 유형이며 나중에 사용하기 위해 어딘가에 저장하지 않습니다.

+2

참고 사항 [로컬 문자열을 슬라이스 (& str)로 반환] (http://stackoverflow.com/questions/29428227/return-local-string-as-a-slice-str) -'Chars' [슬라이스 포함] (https://github.com/rust-lang/rust/blob/1.10.0/src/libcore/str/mod.rs#L326-L328). – Shepmaster

관련 문제