Rust

move

所有权转移
Rust 中的 堆中数据类型变量(如这里的 String),在传递时(赋予一个新变量,同理作为函数实参传入)传递的是整体及其所有权。

堆中数据结构一般指有指针指向的结构: image.png

传递完了,变量就失去了对它的引用了(叫失去所有权更合适)。
所以 n1_test 在进行一次传递后,它就无法在后续作用域中是用了。
n1_test 将所有权 move 给了 n1 的实参:
image.png
inner 代表的数据 move 到 param1:
image.png
此现象在简单数值类型中不会出现,说明是简单数值类型拷贝速度够快,底层直接复制:
image.png
所以面对这种情况,该系列类型数据在进行传递操作后,如要保留原引用,需要使用clone:
image.png
从报错中也可得知,如果实现了copy trait 就应该会在传递时自动clone:
image.png
其实可以看出移动的效果很像浅拷贝,但rust会使变量失效,所以换个叫法叫移动:
image.png

borrow

所以因内堆中数据所有权的限制,rust提供了引用(references )。
引用允许使用值但不获取所有权。引用相当于用一个指针指向堆数指针
image.png

将获取引用作为函数参数称为 借用borrowing)。所以既然是借用当然不能改。
但是类比js中的引用类型,内部的内容是可以修改的,但rust中的引用内部默认不可变,可变引用需要用mut标出,同时引用的数据当然也要在其变量上标记为mut:
image.png
mut引用对同一堆数据同作用域(或者是同一时间只有一个生效)只能有1个;
且对同一数据,mut引用与普通引用也不可共存。

此外还有一种部分引用叫slice:
image.png
image.png
可以看出,slice其实就是可以指定引用范围,像这里的word就是从6位开始11位结束长5的范围引用。且范围引用如果从0开始或末结束,此时的头或尾的数可省略:
image.png