2017-02-22 2 views
2

Ich möchte eine Funktion implementieren, die ein neues Element instanziiert, es zu einer verknüpften Liste hinzufügt und dann den Verweis auf das soeben erstellte Element zurückgibt. Das ist, was ich kam mit:Rückverweis auf Linkedlist-Element

use std::collections::LinkedList; 

struct Bar { 
    ll: LinkedList<Foo> 
} 

struct Foo {} 


impl Bar { 
    fn foo_alloc<'a>(&'a mut self) -> &Option<&'a mut Foo> { 
     let foo = Foo{}; 
     self.ll.push_back(foo); 
     &self.ll.front_mut() 
    } 
} 

Ich dachte, dass wenn ich die Lebensdauer des zurückgegebenen Verweis auf die Bar Instanz (über &'a mut self) binden dann das genug sein sollte, aber anscheinend ist es nicht.

Hier ist der Fehler:

error: borrowed value does not live long enough 
    --> src/main.rs:14:10 
    | 
14 |   &self.ll.front_mut() 
    |   ^^^^^^^^^^^^^^^^^^^ does not live long enough 
15 |  } 
    |  - temporary value only lives until here 
    | 
note: borrowed value must be valid for the lifetime 'a as defined on the body at 11:59... 
    --> src/main.rs:11:60 
    | 
11 |  fn foo_alloc<'a>(&'a mut self) -> &Option<&'a mut Foo> { 
    | ____________________________________________________________^ starting here... 
12 | |   let foo = Foo{}; 
13 | |   self.ll.push_back(foo); 
14 | |   &self.ll.front_mut() 
15 | |  } 
    | |_____^ ...ending here 

Antwort

4

Das Problem innerhalb der Option nicht die Referenz, es ist das Option Objekt selbst. Gebe es als Wert zurück, nicht als Referenz.

Ich habe auch die Lebenszeit Annotationen entfernt, weil die Standard-Lebensdauer Abzug die richtige Sache hier tut.

+0

Ja, das löst es. Ist es richtig zu sagen, dass 'self.ll.front_mut()' eine 'Option' auf dem Stack und die' & 'erstellt, bevor versucht wird, den Verweis auf die Option zurückzugeben, die natürlich nicht lange genug lebt, wenn sie gelöscht wird das Ende der Methode? – hansaplast

+0

Ja, die zurückgegebene Option ist temporär, daher können Sie keine Referenz zurückgeben. –

Verwandte Themen