gpt4 book ai didi

rust - 对 Box 中结构字段的移动语义感到困惑

转载 作者:行者123 更新时间:2023-11-29 07:49:56 25 4
gpt4 key购买 nike

如果我执行以下操作,我会收到错误消息:

struct A;
struct B;

fn consume_a(_a: A) {}
fn consume_b(_b: B) {}

struct C(A, B);

impl C {
fn foo(self: Self) {
consume_a(self.0);
consume_b(self.1);
}
}

fn main() {
let c = Box::new(C(A, B));

// Consume internals
let _a = c.0;
let _b = c.1;
}
error[E0382]: use of moved value: `c`
--> src/main.rs:21:9
|
20 | let _a = c.0;
| -- value moved here
21 | let _b = c.1;
| ^^ value used here after move
|
= note: move occurs because `c.0` has type `A`, which does not implement the `Copy` trait

我可以通过这样做来实现同样的事情(内部消耗):

fn main() {
let c = Box::new(C(A, B));
c.foo();
}

它上面的工作方式(c.foo())意味着我已经搬出了盒装内容;这怎么会发生? Box 文档中的 API 均未显示我可以获得作为类型的包含值(即所有方法返回 &T&mut T 但是不是 T)

最佳答案

正如您在该方法中看到的那样,直接移出结构的字段可以正常工作,但是移出 Box 中的结构的字段将首先移出 将 Box 放入一个临时变量中,然后移出该临时变量的字段。因此,当您尝试移出第二个字段时,Box 已经被销毁,只剩下一个您无法使用的临时区域。

您可以通过自己创建临时文件来完成这项工作:

let c2 = *c;
let _a = c2.0;
let _b = c2.1;

关于rust - 对 Box 中结构字段的移动语义感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38243040/

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