gpt4 book ai didi

rust - 解引用时 Rust 会自动实现克隆吗?

转载 作者:行者123 更新时间:2023-12-03 11:28:55 25 4
gpt4 key购买 nike

#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}

impl Copy for Point {}

impl Clone for Point {
fn clone(&self) -> Point {
*self
}
}
当我只执行 Copy , Rust 告诉我我需要实现 Clone .当我只执行 Clone , Rust 告诉我 Point可以移动。
我的问题是,我从来没有实现过任何东西,这段代码有点像循环依赖,但它有效吗?为什么?

最佳答案

TL;博士:Copy需要 Clone为了方便和 CloneCopy类型通常使用副本来实现。

Rust 编译器通常必须对数据进行逐位复制。但是有两种情况:

  • 如果类型没有实现 Copy ,原始实例不再可用,您的数据已移动。
  • 如果类型确实实现了 Copy ,编译器知道继续使用原始实例和新实例是完全安全的。
  • Copy trait 不会改变编译器只会自动进行按位复制的事实:它是一个没有方法的标记 trait。它的工作只是告诉编译器“在按位复制后可以继续使用它”。 Clone trait 并没有那么特别:它是一个普通的 trait,它的方法可以做任何你想做的事。编译器从不使用 Clone trait 是自动的,并不关心它实际做了什么。然而,它显然是为了创建一个实例的克隆,所以它是完全正常的:
  • 期待 Copy要实现的类型 Clone .毕竟,CopyClone的更严格的版本.这就是为什么Copy: Clone你必须实现 CloneCopy类型。
  • 期待 CloneCopy键入是愚蠢的,只执行按位复制。你不会在这里想要两种不同的语义,那会很困惑。这就是为什么clone用一个简单的 *self 实现在您的示例中:此取消引用 self ,这会导致按位复制。

  • 然而,手动实现这些特征是非常罕见的,大多数情况下,您只需使用 derive :
    #[derive(Copy, Clone, Debug)]
    struct Point {
    x: i32,
    y: i32,
    }

    关于rust - 解引用时 Rust 会自动实现克隆吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63013750/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com