在Rust中,部分移动的值和移动的值之间是否存在任何差异?

在Rust中,部分移动的值和移动的值之间是否存在任何差异?,rust,rust-obsolete,Rust,Rust Obsolete,当前在Rust master(0.10-pre)中,当您移动唯一向量的一个元素并尝试移动另一个元素时,编译器会抱怨: let x = ~[~1, ~2, ~3]; let z0 = x[0]; let z1 = x[1]; // error: use of partially moved value: `x` 此错误消息与移动整个向量时的错误消息有所不同: let y = ~[~1, ~2, ~3]; let y1 = y; let y2 = y; // error: use of moved

当前在Rust master(0.10-pre)中,当您移动唯一向量的一个元素并尝试移动另一个元素时,编译器会抱怨:

let x = ~[~1, ~2, ~3];
let z0 = x[0];
let z1 = x[1]; // error: use of partially moved value: `x`
此错误消息与移动整个向量时的错误消息有所不同:

let y = ~[~1, ~2, ~3];
let y1 = y;
let y2 = y; // error: use of moved value `y`
为什么会有不同的信息?如果在第一个示例中,
x
仅“部分移动”,是否有任何方法“部分移动”x的不同部分?如果不是,为什么不直接说
x
已移动

如果在第一个示例中x只是“部分移动”,有什么方法吗 要“部分移动”x的不同部分

是的,有,但只有当您同时移动这些零件时:

设x=~[~1,~2,~3];
匹配x{
[x1,x2,x3]=>println!(“{}{}{}{},*x1,*x2,*x3),
_=>无法访问!()
}
可以很容易地观察到,
xN
s确实被移出,因为如果在比赛后添加额外的行:

println!(“{:?}”,x);
编译器将抛出一个错误:

main3.rs:16:22: 16:23 error: use of partially moved value: `x`
main3.rs:16     println!("{:?}", x);
                                 ^
note: in expansion of format_args!
<std-macros>:195:27: 195:81 note: expansion site
<std-macros>:194:5: 196:6 note: in expansion of println!
main3.rs:16:5: 16:25 note: expansion site
main3.rs:13:10: 13:12 note: `(*x)[]` moved here because it has type `~int`, which is moved by default (use `ref` to override)
main3.rs:13         [x1, x2, x3] => println!("{} {} {}", *x1, *x2, *x3),
                     ^~
error: aborting due to previous error
main3.rs:16:22:16:23错误:使用部分移动的值:`x`
main3.rs:16 println!(“{:?}”,x);
^
注意:在格式参数的扩展中!
:195:27:195:81注:扩建场地
:194:5:196:6注:在println的扩展中!
main3.rs:16:5:16:25注:扩展站点
main3.rs:13:10:13:12注意:`(*x)[`之所以移动到这里,是因为它具有默认移动的类型`~int`(使用`ref`覆盖)
main3.rs:13[x1,x2,x3]=>println!(“{}{}{}”、*x1、*x2、*x3),
^~
错误:由于上一个错误而中止

对于结构和枚举也是如此-它们也可以部分移动。

即使无法部分移动元素,也可以使用不同的错误消息,因为移动元素与移动整个向量不同。有准确的错误信息从来不会有什么坏处。