Vec { let mut v0 = vec![0,1,2]; -6ren">
gpt4 book ai didi

rust - 分配给移动的变量似乎是 "negate"移动

转载 作者:行者123 更新时间:2023-11-29 08:10:40 26 4
gpt4 key购买 nike

此函数无法编译,因为它试图返回 v0,它已被移动到分配给 v1 的位置。我明白这一点。

fn testvec() -> Vec<i64> {
let mut v0 = vec![0,1,2];
let v1 = v0;
//v0 = vec![1,2,3];
v0
}

但是如果我取消注释 v0 分配,它编译。这背后的原理是什么?是否记录在案?

当我第一次发现这种行为时,该函数看起来像这样。它的作用与上面相同,但我也想知道嵌套 block 是否有所不同。

fn testvec() -> Vec<i64> {
let mut v0 = vec![0,1,2];
{
let v1 = v0;
//v0 = vec![1,2,3];
}
v0
}

更新

总结一下我的困惑:我认为“移动”实际上使变量名无法访问。但实际上只有变量的内容变得不可访问。例如。这个编译器错误具有误导性:v0 moved here because - 听起来变量 name 被移动而不仅仅是它的值。

最佳答案

想到v0v1作为可以包含一个小部件的纸板箱。

let mut v0 = vec![0, 1, 2];您创建了一个纸板箱,其侧面用黑色记号笔写有标签“v0”,标签上写着“内容:一个 Vec<i64> ”,并在其中放置一个标有“[0, 1, 2]”的小部件。 (“mut”变成了盒子上的俗气标签,表示您可以随意摆弄存储在其中的内容,例如将一个新元素推到矢量上,或者扔掉矢量并在其位置放置一个新元素。)

let v1 = v0; ,您创建另一个纸板箱,这个带有标签“v1”(和另一个“内容:一个Vec<i64>”标签),然后将小部件从“v0”框中取出并放入“v1”框中。 (v1 纸板箱,没有用 mut 声明,变成了盒子侧面的俗气贴纸,上面写着你只能把小部件从盒子里拿出来,不能把任何其他东西放进去。”不是为了重复使用,”它写道。也许翻盖式包装更适合这样的东西。注意不要让剪刀伤到自己。)

v0 纸板箱现在不包含任何小部件,因此“内容:一个 Vec<i64> ” 不是真的——直到它再次成为真的,你不能从盒子里拿出任何东西或使用盒子里的东西,是吗?如果您询问其内容,例如指定 v0作为函数的返回值,编译器会对你大喊大叫,因为它知道纸板箱中不会有小部件。

如果您在嵌套 block 中声明了 v1 纸板箱,当您到达该 block 的末尾时,您会用袖珍火焰喷射器燃烧 v1 纸板箱和其中的任何东西。

如果你写v0 = vec![1, 2, 3] ,您正在创建一个带有标签“[1, 2, 3]”的新小部件,并将其放入标有 v0 的纸板箱中。编译器按照指令表可以看到,到函数结束时,v0 纸板箱将始终包含一个小部件,因此它允许您将其作为值返回。


应用类比:

fn testvec() -> Vec<i64> {
let mut v0 = vec![0,1,2];
let v1 = v0;
v0 = vec![1,2,3];
v0
}

这是一份说明书,内容大致如下:

  1. 此说明表称为“testvec”并生成一个 Vec<i64>小部件。

  2. 拿一个纸板箱,在它的边上写上“v0”。

    制作 [0, 1, 2]小部件并将其放入 v0 框中。

  3. 拿一个纸板箱,在它的边上写上“v1”。

    乘坐[0, 1, 2]从 v0 框中取出小部件并将其放入 v1 框中。

  4. 制作 [1, 2, 3]小部件并将其放入(现在为空)v0 框中。

  5. 从 v0 盒子中取出小部件:它是本说明书的最终产品。

    哦,我们不再需要那个 v1 盒子了,所以烧掉它和它包含的小部件。

关于rust - 分配给移动的变量似乎是 "negate"移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32237882/

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