В Rust, Clone
- это признак, который определяет метод clone
(и clone_from
). Некоторые черты, такие как StrSlice
и CloneableVector
, указывают to_owned
fn. Для чего нужна реализация? В чем разница?В Rust, в чем разница между clone() и to_owned()?
я сделал эксперимент с ржавчиной строк, которые имеют оба метода, и это свидетельствует о том, что есть разница, но я не понимаю:
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);
}
Компиляция ошибка времени для to_owned
примера :
error: mismatched types: expected `~str` but found `&'static str`
(str storage differs: expected `~` but found `&'static `)
clone.rs:30 println!("{:?}", c1 == s1);
Почему первый пример работает, но не второй?
Эта ошибка больше не воспроизводится в текущем Rust (см. На [Playground] (http://is.gd/2bYnMW), где я заменил '~" abc "' на '' abc ".to_string()' –
Я обновил пример, чтобы использовать 'to_string()' вместо более старой '~' нотации. Однако интересно, что эта новая версия (ваша игровая площадка) теперь компилируется и выполняется нормально. Было ли изменение в '==' operator/fn, чтобы он мог сравнивать типы '& str' и' String' для равенства значений? – quux00