2017-01-27 6 views
0

Ich möchte eine Holded Instanz behalten, aber ich kann nicht, da es in einem Array ist. Wie kann ich diese Instanz aus dem Array "extrahieren" und in einer Object Instanz speichern? (In meinem ursprünglichen Code habe ich kein Array, sondern Iteratoren). Hier ist der entsprechende Code:`Array` lebt nicht lange genug

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 
} 

Die Fehlermeldung:

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

Es gibt [** 87 Fragen ** mit der gleichen Fehlermeldung] (http://stackoverflow.com/search?q=is%3Aq+Cannot+Infer+an+angewohnlich+Lebensdauer+zu+konflikt + Anforderungen). Vielleicht könnten Sie sich die Zeit nehmen, einige von ihnen zu rezensieren und zu erklären, warum * diese * Frage speziell und anders ist und noch nicht beantwortet wurde? – Shepmaster

+0

Ich habe schon viele von ihnen gesehen, aber das Problem hier ist meistens ich verstehe nicht ruhig _why_ Ich habe diesen Fehler, und den anderen Beitrag zu sehen hilft mir dabei nicht. –

+0

Ich habe auch viele von ihnen gesehen, und das Problem wird in einem erklärt. - Sehen Sie, wie nützlich es ist, wenn Sie nicht angeben, was mit den vorhandenen Fragen * falsch * ist? Wenn Sie uns nicht sagen, was falsch ist, werden wir nur die gleiche Antwort wiederholen, die Sie bereits nicht verstehen, Ihnen wird nicht geholfen, und, noch schlimmer, es wird noch eine weitere Antwort geben, die die nächste Person nicht beantworten wird Lesen Sie und ignorieren Sie stattdessen und bitten Sie darum, ihren Code zu korrigieren. – Shepmaster

Antwort

0

Im MCVE Sie gebucht haben, die Struktur Object enthält einen Verweis auf Holded:

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

In der Funktion work() geben Sie eine Object (optional) zurück:

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

Sie erwerben Holded aus einer Funktion, die es von Wert zurückgibt:

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

Jetzt wird dies nicht funktionieren. Wenn Sie einen Verweis auf Holded zurückgeben, muss die Holded, auf die Sie verweisen, irgendwo gespeichert werden. Dies bedeutet entweder als Eingang oder als Ausgang der Funktion work().

Ich schrieb Ihr Beispiel um Holded innerhalb Holder. Das ist eine Möglichkeit, dies zu lösen. Aber ich bin mir nicht sicher, dass dies für Ihr ursprüngliches Problem gelten würde.

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

Man merkt, ich auch einen anderen Weg, um die work() Funktion (work2()) zu implementieren, hinzugefügt.

Verwandte Themen