2016-03-24 10 views
4

Rust scheint so eine optimale Sprache zu sein - ich hätte wissen müssen, dass der Kampf gegen den Compiler der Preis wäre. Ich versuche, einen Konstruktor für eine Struktur zu erstellen, und ich bekomme does not live long enough Fehler.Wie erstellt man eine Struktur mit einem Vektor von Referenzen?

Destilliertes auf die nötigsten Knochen, ich habe:

fn main() { 
    println!("RUST PLEASE"); 
} 

struct Help<'a> { 
    list: Vec<&'a Traits> 
} 

impl<'a> Help<'a> { 
    fn new() -> Help<'a> { 
     Help { list: vec![&Test] } 
    } 
} 

trait Traits { 
    fn mice(&self); 
} 

struct Test; 
impl Traits for Test { 
    fn mice(&self) { print!("WHY"); } 
} 

Also, ich bin dies zu tun, weil das Vektor list soll eine Liste der Charakterzug Gegenstände halten. Es hält (angeblich) heterogen jede Klasse, die das zugefügte Merkmal implementiert. So wie ich es verstehe, muss ich Referenzen verwenden, damit der Vektor eine echte Größe hat, mit der er arbeiten kann. Und da es eine Referenz ist, muss die Lebenszeit da sein, um sicherzustellen, dass sie zusammen leben und sterben.

Die Sache ist, ich weiß, was los ist. In new gehört das Test in den Bereich new, und ich versuche, seine Referenz nach oben und außerhalb der Funktion zu übergeben. Wenn ich das tue, geht Test aus dem Geltungsbereich und die Referenz ist schlecht. Also was mache ich? Wie kann ich erreichen, dass das Objekt die Lebensdauer von Help hält? Schließlich gibt es wirklich niemanden, der es besitzen könnte.

Außerdem, wenn jemand irgendwelche Tipps im Allgemeinen darüber hat, wie man Referenzen aus einer Funktion im Allgemeinen zurückgibt, würde ich mich sehr freuen, sie zu hören.

BEARBEITEN Dies ist nicht das Gleiche wie einfach das Eigentum des Objekts übergeben; Ich kann das nicht tun, weil der Vektor eine Referenz anstelle eines Objekts auf dem Stapel benötigt. Die Antwort von Simon ist wahrscheinlich das, wonach ich gesucht habe - ich hatte vergessen, dass ich so Dinge einrahmen könnte.

+0

Mögliche Duplikat [Expanding Rust Lebensdauer] (http://stackoverflow.com/questions/31252851/expanding-rust-lifetime) –

Antwort

3

Sie wahrscheinlich nicht wirklich Referenzen zurückkehren wollen ... aber man könnte sie stattdessen Box und haben sie als Paket Wert besitzen:

fn main() { 
    println!("RUST PLEASE"); 
} 

struct Help { 
    list: Vec<Box<Traits>> 
} 

impl Help { 
    fn new() -> Help { 
     Help { list: vec![Box::new(Test)] } 
    } 
} 

trait Traits { 
    fn mice(&self); 
} 

struct Test; 
impl Traits for Test { 
    fn mice(&self) { print!("WHY"); } 
} 

Ihre Help struct dann einen Vektor von boxed Werte besitzt, dass Sie können dann vorwärts gehen.

Playpen link