2016-04-16 14 views
2

den folgenden Code gegeben (was nicht kompiliert):Haben Rust-Sammlungen die Fähigkeit, die Daten zu besitzen, die sie speichern?

fn main() { 
    let mut v = vec!(); 

    { 
     let name = "Bob the Builder".to_string(); 

     v.push(&name); 
    } 

    for m in &v{ 
     println!("{}", m); 
    } 
} 

ich eine Variable erstellt haben zu einer Rust String Art Bindung, die innerhalb des ersten Satzes von geschweiften Klammern den Gültigkeitsbereich verlassen wird. Gibt es eine Möglichkeit, die Eigentumsrechte der Zeichenfolge irgendwie zu verschieben, so dass der Vektor sie besitzt?

Dies ist ein willkürliches Beispiel, aber ich versuche nur zu verstehen, ob dieses Konzept möglich ist.

Ich weiß bereits, dass wenn ich ein String-Literal dies als eine statische Zeichenfolge, die für die gesamte Lebensdauer der App bestehen wird und daher dieser Code würde kompilieren würde, aber ich versuche nur zu verstehen, ob eine Sammlung in Rust kann Daten besitzen. Ich weiß, Rust ist nicht Objective-C, aber Objective-C verfügt über Sammlungen mit der Fähigkeit, ihre Daten zu behalten.

Antwort

5

Der Vektor wird es besitzen .. solange Sie keinen Hinweis darauf übergeben.

Ändern Sie den Code dazu:

fn main() { 
    let mut v = vec!(); 
    { 
     let name = "Bob the Builder".to_string(); 

     v.push(name); // <--- no ampersand 

     println!("{}", name); // <---- error, use of moved value 
    } 

    for m in &v { 
     println!("{}", m); 
    } 
} 

einen Fehler ..throws weil name jetzt von der Vector gehört. Wenn Sie die Tatsache berücksichtigt, dass jetzt der Vektor die Zeichenfolge besitzt .. Code (durch Entfernen meine println! Anruf) kompiliert:

fn main() { 
    let mut v = vec!(); 
    { 
     let name = "Bob the Builder".to_string(); 

     v.push(name); // <--- no ampersand 
    } 

    for m in &v { 
     println!("{}", m); // <--- works fine 
    } 
} 

Also Ihr Problem ist, dass Sie einen Verweis auf die Zeichenfolge in den Vektor vorbei sind . Im Wesentlichen wird am Ende des Blocks Ihr name Wert fallengelassen und Ihre &name Referenz im Vector könnte möglicherweise auf ungültigen Speicher verweisen .. machen v[0].something_here() potenziell gefährlich. Also stoppt der Compiler Sie. Aber, wenn Sie den Besitz der Variablen name in den Vektor übertragen (indem Sie nicht eine Referenz übergeben .. aber die ganze Sache übergeben) dann Rust weiß, um die Zeichenfolge zu reinigen, wenn es den Vector reinigt.

+0

Dies ist einer dieser doh! Momente ... wenn du es so sagst ... macht Sinn. Danke für die Hilfe. –

+0

@RalphCaraveo Wenn ich neue Sprachen lerne, empfehle ich immer [gummiente debuggen] (http://www.rubberduckdebugging.com/). – Kroltan