谁拥有没有let绑定的值?

3

Consider the following code:

struct MyStruct {
    not_copyable: NotCopyable
}

struct NotCopyable;

fn main() {
    let foo = MyStruct { not_copyable: NotCopyable };
    foo.not_copyable;
    foo.not_copyable;

    // just found out the simpler "foo; foo;" will create the same problem
}

这段代码编译失败,报错信息如下:

src/main.rs:17:5: 17:21 error: use of moved value: `foo.not_copyable` [E0382]
src/main.rs:17     foo.not_copyable;
                   ^~~~~~~~~~~~~~~~
src/main.rs:16:5: 16:21 note: `foo.not_copyable` moved here because it has type `NotCopyable`, which is non-copyable
src/main.rs:16     foo.not_copyable;
                   ^~~~~~~~~~~~~~~~
error: aborting due to previous error

虽然我对所有权系统还不是很熟悉,但我明白为什么你不能创建两个let绑定到foo.not_copyable。但在这种情况下没有绑定。那么谁拥有not_copyable;它被移动到哪里了?

1个回答

2

那么`not_copyable here;`的所有者是谁?它被移动到了哪里?

没有人拥有它。表达式foo.not_copyable必须从结构中取出该值,因为该值是表达式的结果。你不对该值做任何事情并不重要;你请求该值,它给你该值。

编译器在某些情况下可能能够优化掉这个过程,但如果没有这个优化,它将像你要求的那样移动该值。

是的,foo;foo;将做同样的事情:就像NotCopyable不可复制一样,MyString也是不可复制的。


所以这个表达式基本上“消除”了任何可能对该值拥有的所有权? - musiKk
更像是它像通常那样转移所有权...只不过没有人把它拿着,它就从桌子边缘移到了地板上,被办公室的自动吸尘器吸走了。(请不要将这个玩笑般的比喻视为Rust具有追踪垃圾回收的暗示;它没有小型软件吸尘器来清理松散的分配。) - DK.
好的。foo.not_copyable 移动了两个值:foofoonot_copyable,这正确吗? - musiKk
不会。它只会移动 foo.not_copyable。如果结构中有两个字段,您可以先移动一个,然后再移动另一个。话虽如此,一旦移动了 non_copyable,整个 foo 结构就被有效地移动了。 - DK.
哎呀,我的误解是由于我有另一个问题,但那应该成为另一个问题的主题。谢谢! - musiKk
好的,我可能是指 foo 被部分移动了。因为如果你在 foo.not_copyable 之后尝试评估 foo,错误消息就是这样说的。 - musiKk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接