人们通常如何在Rust中复制值?

til*_*boy -2 rust

基元应照常按值传递,并且应复制通过引用传递的任何内容(“借用”)。就像是:

let a = 7;
let b = duplicate(a);  // let b = a;

let a = struct{}{};
let b = duplicate(a);  // let b = a.clone();
Run Code Online (Sandbox Code Playgroud)

假设Rust中的每个值都实现CloneCopy特质。这个假设是真的吗?如果没有,是不是可以定义一个特点Duplicate是类型的enum { Clone, Copy }

She*_*ter 5

假设Rust中的每个值都实现CloneCopy特质。这个假设是真的吗?

没有。

是否可以定义特征 Duplicate

是的,但是除了现有Clone特征之外,它似乎没有其他价值。


您可能希望了解有关所有权的更多信息,因为您无需进行任何克隆就可以编译代码:

fn duplicate<T>(x: T) -> T { x } // sic

fn main() {
    let a = 7;
    let b = duplicate(a);

    let a = String::from("example");
    let b = duplicate(a);
}
Run Code Online (Sandbox Code Playgroud)

如果您确实想复制,则只需使用Clone,因为实现的任何东西都Copy必须实现Clone

pub trait Copy: Clone { }
Run Code Online (Sandbox Code Playgroud)

您通常会将其视为方法语法:

fn main() {
    let a = 7;
    let b: i32 = a.clone();

    let a = String::from("example");
    let b: String = a.clone();
}
Run Code Online (Sandbox Code Playgroud)

如果需要函数,请使用标准语法:

fn main() {
    let a = 7;
    let b: i32 = Clone::clone(&a);

    let a = String::from("example");
    let b: String = Clone::clone(&a);
}
Run Code Online (Sandbox Code Playgroud)

要么

fn main() {
    let a = 7;
    let b: i32 = i32::clone(&a);

    let a = String::from("example");
    let b: String = String::clone(&a);
}
Run Code Online (Sandbox Code Playgroud)

这里所有显式类型(: foo)都是多余的,仅用于演示目的。