在Rust中,clone()和to_owned()有什么区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (59)

在Rust中,Clone是指定clone方法(和clone_from)的特征。一些特质,比如StrSliceCloneableVector 指定一个to_ownedFN。为什么实现需要这两个?有什么不同?

我用Rust字符串做了一个实验,它有两种方法,它证明了它们有区别,但我不明白它:

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

为什么第一个例子会工作,但第二个例子不行?

提问于
用户回答回答于

.clone()返回它的接收器。clone()在一个&str回报a &str。如果你想要String,需要一个不同的方法,在这种情况下是.to_owned()

对于大多数类型而言,clone()是足够的,因为它只在底层类型上定义,而不是在引用类型上定义。但是对于str[T]clone()在引用类型(&str&[T])上实现,因此它具有错误的类型。它也在拥有的类型(StringVec<T>)上实现,并且在这种情况下clone()将返回另一个拥有的值。

你的第一个例子工作,因为c1s1(和c2s2)具有相同的类型。因为他们不这样做(你的第二个例子失败c1Strings1&str)。

扫码关注云+社区