代码之家  ›  专栏  ›  技术社区  ›  tifrel

一个人如何在铁锈中复制一个值?

  •  -2
  • tifrel  · 技术社区  · 6 年前

    原语应该像往常一样按值传递,通过引用传递的任何内容(“借来的”)都应该被克隆类似于:

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

    这假设rust中的每个值都实现了 Clone 或者 Copy 特质。这个假设是真的吗如果没有,是否可以定义一个特征 Duplicate 那是一种 enum { Clone, Copy } 是吗?

    2 回复  |  直到 6 年前
        1
  •  5
  •   Shepmaster Tim Diekmann    6 年前

    这假设rust中的每个值都实现了 Clone 或者 Copy 特质。这个假设是真的吗?

    不。

    有可能定义一个特征吗 Duplicate

    是的,但它似乎没有任何价值超过现有的价值。 克隆 特质确实如此。


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

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

    如果你真的想复制,就用 克隆 ,作为 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 )这里是多余的,只是为了演示。

        2
  •  4
  •   Sebastian Redl    6 年前

    Copy 暗示 Clone . 你可以用 .clone() 为了你的复制功能。