1. 编译器报错,提示s已经move。
error[E0382]: use of moved value: `s`
2. 编译器报错,提示如下:
error[E0382]: borrow of moved value: `p1`
--> src/main.rs:9:25
|
7 | let p1 = Point{x:1, y:1, z:1};
| -- move occurs because `p1` has type `Point`, which does not implement the `Copy` trait
8 | let p2 = p1;
| -- value moved here
9 | println!("{:?}, {:?}", p1, p2);
| ^^ value borrowed here after move
作者回复: 对的
-Hedon🍭
2023-10-23来自湖北
思考题1:编译报错。因为在第一次循环的时候,s 的所有权已经转移到 tmp_s 了,后面 s 已经是无效状态了,不能再转移所有权。
思考题2:移动。
作者回复: 棒!
-Hedon🍭
2023-10-23来自湖北
思考题1:编译报错。因为 s 的所有权在第一次循环的时候已经移动到 tmp_s 了,s 已经是处于无效状态了。
作者回复: 厉害
julia
2023-10-24来自重庆
1. String类型,实际数据在堆上存储。 let tmp_s = s 循环第一次的时候,会移动所有权,s在栈上的内存虽然还在,但是被编译器视为无效变量或无效状态,所以第二次及以后的循环就不能实验变量s了,编译器会报错。
2. 结构体类型默认没有实现Copy trait, 赋值过程也会移动所有权。
当然从底层看,这个Point结构体的成员都是基本类型(基本类型实现了Copy), 所以这个结构体的值是保存在栈上的,所以赋值操作,实际上底层是在栈上完整拷贝了一次Point结构体,但是编译器依然会把原来的Point结构体变量视为无效状态或无效变量。
1. 会报错,甚至在编译之前,VSCode 就已经提前知道错误信息:use of moved value: `s` value moved here, in previous iteration of loop。并给出了对应的解决方案,加上 .clone(if the performance cost is acceptable)