2016-07-24 13 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

関連する問題