首页 文章

如何在Rust中一般复制一个值?

提问于
浏览
-2

原语应像往常一样按值传递,并且应克隆通过引用传递的任何内容('借用') . 就像是:

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

let a = struct{}{};
let b = duplicate(a);  // let b = a.clone();

这假设Rust中的每个值都实现 CloneCopy 特征 . 这个假设是真的吗?如果没有,是否可以定义 Duplicate 的特征 Duplicate

2 回答

  • 4

    这假设Rust中的每个值都实现了克隆或复制特征 . 这个假设是真的吗?

    没有 .

    是否可以定义特征重复

    是的,但它似乎没有提供超出现有 Clone 特性的任何 Value .


    您可能希望了解有关所有权的更多信息,因为您可以在不进行任何克隆的情况下编译代码:

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

    如果你真的想复制,只需使用 Clone ,如anything that implements Copy must implement Clone

    pub trait Copy: Clone { }
    

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

    fn main() {
        let a = 7;
        let b: i32 = a.clone();
    
        let a = String::from("example");
        let b: String = a.clone();
    }
    

    如果需要函数,请使用完全限定语法:

    fn main() {
        let a = 7;
        let b: i32 = Clone::clone(&a);
    
        let a = String::from("example");
        let b: String = Clone::clone(&a);
    }
    

    要么

    fn main() {
        let a = 7;
        let b: i32 = i32::clone(&a);
    
        let a = String::from("example");
        let b: String = String::clone(&a);
    }
    

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

  • 4

    Copy 暗示 Clone . 您可以使用 .clone() 作为重复功能 .

相关问题