![[衰]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_34.cf5b4d5.png)
## rust 所有权转移问题解决思路
类似如下报错:
cannot move out of here
| move occurs because `list[_]` has type `T`, which does not implement the `Copy` trait
| help: consider borrowing here: `&list[0]`
1. 首先Rust规定引用不允许转移所有权
2. list是切片引用类型 &[T](引用的是数组某些元素的切片),但是list里的元素是T类型,而不是&T
3. 对于 Copy 类型(如 i32、u32 等),索引操作会直接将值复制到新的变量中,因此不会引起所有权转移。
对于非 Copy 类型(如 String、Vec 等),如果你尝试通过索引操作将值赋给一个变量,Rust 会尝试移动该值,从而导致所有权转移。
4. 但是引用又不允许所有权转移,所以报错,把T加上 Copy 约束,这个特征表示类型 T 的值是可以被“复制”的,而不是移动的。对于实现了 Copy 特征的类型,Rust 在赋值时会自动执行浅拷贝,而不是移动所有权。
类似如下报错:
cannot move out of here
| move occurs because `list[_]` has type `T`, which does not implement the `Copy` trait
| help: consider borrowing here: `&list[0]`
1. 首先Rust规定引用不允许转移所有权
2. list是切片引用类型 &[T](引用的是数组某些元素的切片),但是list里的元素是T类型,而不是&T
3. 对于 Copy 类型(如 i32、u32 等),索引操作会直接将值复制到新的变量中,因此不会引起所有权转移。
对于非 Copy 类型(如 String、Vec 等),如果你尝试通过索引操作将值赋给一个变量,Rust 会尝试移动该值,从而导致所有权转移。
4. 但是引用又不允许所有权转移,所以报错,把T加上 Copy 约束,这个特征表示类型 T 的值是可以被“复制”的,而不是移动的。对于实现了 Copy 特征的类型,Rust 在赋值时会自动执行浅拷贝,而不是移动所有权。
展开
评论
点赞