In Rost, was ist der Unterschied zwischen clone() und to_owned()?

In Rust Clone ist eine Eigenschaft, die angibt, wie clone Methode (und clone_from). Einige Merkmale, wie StrSlice und CloneableVector angeben to_owned fn. Warum würde eine Umsetzung benötigen die beiden? Was ist der Unterschied?

Ich ein experiment mit Rost-strings, die haben beide Methoden, und es zeigt, dass es einen Unterschied gibt, aber ich verstehe es nicht:

fn main() {
    test_clone();
    test_to_owned();
}

//compiles and runs fine    
fn test_clone() {
    let s1: &'static str = "I am static";
    let s2 = "I am boxed and owned".to_string();

    let c1 = s1.clone();
    let c2 = s2.clone();

    println!("{:?}", c1);
    println!("{:?}", c2);

    println!("{:?}", c1 == s1);  //prints true
    println!("{:?}", c2 == s2);  //prints true
}

fn test_to_owned() {
    let s1: &'static str = "I am static";
    let s2 = "I am boxed and owned".to_string();

    let c1 = s1.to_owned();
    let c2 = s2.to_owned();

    println!("{:?}", c1);
    println!("{:?}", c2);

    println!("{:?}", c1 == s1);   //compile-time error here (see below)
    println!("{:?}", c2 == s2);
}

Compile-Zeit-Fehler für die to_owned Beispiel:

error: mismatched types: expected `~str` but found `&'static str` 
(str storage differs: expected `~` but found `&'static `)
clone.rs:30     println!("{:?}", c1 == s1);

Warum würde das erste Beispiel arbeiten, aber nicht die zweite?

  • Dieser Fehler ist nicht reproduzierbar mehr in der aktuellen Rost (siehe in der Spielplatz, wo ich ersetzt ~"abc" mit "abc".to_string()
  • Ich aktualisierte das Beispiel zu verwenden to_string() eher als die älteren ' ~ ' - notation. Es ist jedoch interessant, dass diese neue version (Ihr Eintrag) jetzt kompiliert und läuft einwandfrei. Hat eine änderung der == Betreiber/fn passieren, damit Sie vergleichen können &str und String - Typen für den Wert der Gleichheit?
InformationsquelleAutor quux00 | 2014-03-08
Schreibe einen Kommentar