2017-01-27 3 views
0

Holdedのインスタンスを保持したいのですが、配列になっているのでできません。このインスタンスを配列から「抽出」してObjectインスタンスに保持するにはどうすればよいですか? (私の元のコードでは、配列はありませんが反復子はありません)。ここで同等のコードは次のとおりです。`array`は長時間生きていません

struct Holded { 
    value: u8, 
} 

struct Holder; 

impl Holder { 
    pub fn get(&self) -> [Holded; 2] { 
     [Holded { value: 0 }, Holded { value: 1 }] 
    } 
} 

struct Object<'a> { 
    holded: &'a Holded, 
} 

fn main() { 
    let holder = Holder; 

    let obj = work(&holder).unwrap(); 
    println!("{}", obj.holded.value); 
} 

fn work(holder: &Holder) -> Option<Object> { 
    let mut obj: Object; 
    let array = holder.get(); 

    for h in array.into_iter() { 
     if h.value == 1u8 { 
      obj = Object { holded: h }; 
      return Some(obj); 
     } 
    } 

    None 
} 

エラーメッセージ:あなたが投稿したMCVEで

error: `array` does not live long enough 
    --> src/main.rs:28:14 
    | 
28 |  for h in array.into_iter() { 
    |    ^^^^^ does not live long enough 
... 
36 | } 
    | - borrowed value only lives until here 
    | 
note: borrowed value must be valid for the anonymous lifetime #1 defined on the block at 24:43... 
    --> src/main.rs:24:44 
    | 
24 | fn work(holder: &Holder) -> Option<Object> { 
    |           ^
+1

[同じエラーメッセージと** 87個の質問**](http://stackoverflow.com/search?q=is%3Aq+Cannot+infer+an+appropriate+lifetime+due+to+conflictingがあります。 +要件)。おそらく、あなたはそれらのいくつかを見直し、なぜこの*質問が特別で異なっていて、まだ答えられていないのかを説明する時間を取ることができますか? – Shepmaster

+0

私はすでにそれらの多くを見ていましたが、ここの問題はほとんど私が静かではないことを理解しています_why_私はこのエラーがあり、他の投稿を見ることは私を助けません。 –

+0

私はまたそれらの多くを見てきました。問題は1つで説明されています。 - 既存の質問のうち*何が*間違っているのかを指摘していないときの有用性を確認してください。あなたが何が間違っているのかを教えてくれないならば、私たちはあなたがすでに理解していない同じ答えを繰り返すだけで、あなたは助けられませんし、さらに悪いことに、読んで代わりに無視して、コードを修正するよう依頼してください。 – Shepmaster

答えて

0

、構造体ObjectHoldedへの参照が含まれています

機能で
struct Object<'a> { 
    holded: &'a Holded, 
} 

work()あなたはObject(オプション)を返す:

fn work(holder: &Holder) -> Option<Object> { 

あなたは値によって、それを返す関数からHoldedを取得:今、これが機能することはありません

impl Holder { 
    pub fn get(&self) -> [Holded; 2] { 
     [Holded { value: 0 }, Holded { value: 1 }] 
    } 
} 

Holdedへの参照を返す場合は、参照先のHoldedをどこかに保存する必要があります。これは、入力として、または関数work()の出力としてのいずれかを意味します。

私はHolder内部Holdedを含めるようにあなたの例を書き直しました。それがこれを解決する一つの方法です。しかし、私はあなたの元の問題にこれが当てはまるかどうかはわかりません。

struct Holded { 
    value: u8, 
} 

struct Holder{ 
    value: [Holded; 2], 
} 

impl Holder { 
    pub fn new() -> Holder { 
     Holder {value: [Holded { value: 0 }, Holded { value: 1 }] } 
    } 

    pub fn get(&self) -> &[Holded; 2] { 
     &self.value 
    } 
} 

struct Object<'a> { 
    holded: &'a Holded, 
} 

fn main() { 
    let holder = Holder::new(); 

    let obj = work(&holder).unwrap(); 
    println!("{}", obj.holded.value); 

    let obj = work2(&holder).unwrap(); 
    println!("{}", obj.holded.value); 
} 

fn work(holder: &Holder) -> Option<Object> { 
    let obj: Object; 
    let array = holder.get(); 

    for h in array.into_iter() { 
     if h.value == 1u8 { 
      obj = Object { holded: h }; 
      return Some(obj); 
     } 
    } 

    None 
} 

fn work2(holder: &Holder) -> Option<Object> { 
    holder.get() 
     .iter() 
     .filter(|h| h.value == 1u8) 
     .map(|h| Object { holded: h }) 
     .next() 
} 

あなたは、私はまたwork()機能(work2())を実装する別の方法を追加しました気づきます。

関連する問題