gpt4 book ai didi

Rust 结构更新语法而不取得所有权

转载 作者:行者123 更新时间:2023-12-03 11:31:16 24 4
gpt4 key购买 nike

#[derive(Debug)]
struct Car {
company: String,
model: String,
cost: i32
}

fn main() {
let car1 = Car {
company: String::from("Ford"),
model: String::from("123xyz"),
cost: 50000
};
let car2 = Car {
model: String::from("987pqr"),
cost: 47000,
..car1
};
println!("{:#?}", car2);
println!("{:#?}", car1.company);
}
这里编译器正确地告诉我:
println!("{:#?}", car1.company);
^^^^^^^^^^^^ value borrowed here after move
move occurs because `car1.company` has type `String`, which does not implement the `Copy` trait
我知道 String 实例在堆上,这就是为什么它不能被复制,所有权被移到 car2.company .我可以通过以下方式解决这个用例:
#[derive(Debug, Clone)]
struct Car {
company: String,
model: String,
cost: i32
}

fn main() {
let car1 = Car {
company: String::from("Ford"),
model: String::from("123xyz"),
cost: 50000
};
let car2 = Car {
model: String::from("987pqr"),
cost: 47000,
..car1.clone()
};
println!("{:#?}", car2);
println!("{:#?}", car1.company);
}
问题一 : 有一个更好的方法吗?

现在我的问题是,如果结构有很多字段,克隆将创建结构的 car1 实例的副本,只是为了使用其值分配给结构的 car2 实例,该实例本身将存储值。
如果 x 是存储 struct Car 的实例所需的内存,
  • 汽车1:x
  • car1.clone: x
  • 汽车2:x

  • 需要 3 倍内存,而技术上只需要 2 倍内存。
    问题2 : car2之后被实例化将 car1.clone()超出范围并因此放弃内存?
    如果是:这种克隆方法很好,因为只需要临时的一个额外的 x 内存。
    如果不是:那么有没有一种方法可以在不需要额外的 x 内存或获取绑定(bind)本身的所有权的情况下实现此目标。

    最佳答案

    您实际上是在问 ..car1.clone()执行部分克隆,并且只克隆缺失的字段,即 company对于 car2 .
    那会是一个可能的优化吗?可能,但是 clone() 可以做任何事情,因此执行“部分clone()”可能不会那么简单。所以答案是否定的,car1.clone()被完全克隆。

    Question 1: Is there a better way to do this?


    我假设您使用的是更新语法 ( .. ),因为您有更多的字段。但是,如果没有,那么要避免不必要的克隆 model .然后您可以显式克隆并分配 car1.company .
    不过,我想你已经知道了。但是如果你想避免不必要的克隆 model .然后这是替代解决方案。
    let car2 = Car {
    company: car1.company.clone(),
    model: String::from("987pqr"),
    cost: 47000,
    };

    Question 2: After car2 is instantiated will car1.clone() go out of scope and hence relinquish the memory?


    是的。 model来自 car1.clone()在分配给 car2 后立即删除.但是, company当然不会被删除,因为它已移至 car2 .

    关于Rust 结构更新语法而不取得所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65381955/

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