Dans la Rouille, quelle est la différence entre le clone() et to_owned()?

Dans la Rouille, Clone est un trait de caractère qui indique le clone méthode (et clone_from). Certains traits, comme StrSlice et CloneableVector spécifier un to_owned fn. Pourquoi une mise en œuvre à la fois besoin? Quelle est la différence?

J'ai fait une expérience avec de la Rouille des chaînes, qui ont à la fois des méthodes, et il montre qu'il existe une différence, mais je ne la comprends pas:

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

L'erreur de compilation pour le to_owned exemple:

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

Pourquoi le premier exemple de travail mais pas la seconde?

  • Cette erreur n'est pas reproductible en plus dans le courant de la Rouille (voir le Jeux où j'ai remplacé ~"abc" avec "abc".to_string()
  • J'ai mis à jour l'exemple de l'utilisation to_string() plutôt que les anciennes '~' la notation. Cependant, il est intéressant de noter que cette nouvelle version (votre terrain de jeu d'entrée) maintenant compile et fonctionne très bien. Fait un changement dans le == opérateur/fn arriver afin qu'il puisse comparer &str et String types de valeur de l'égalité?
InformationsquelleAutor quux00 | 2014-03-08