Rust的变量所有权

所有权

每个都且只有一个所有者(是一个变量)。

当这个变量一旦离开作用域,这个值对应的内存空间将被清除。

所有权的转移

变量间引用

所有权进行转移后,原本变量就不在拥有对这个值的引用

1
2
3
4
5
6
7
let s1 = String::("hello");
//此时“hello”这个值所在内存空间的所有者是s1
let s2 = s1;
//所有者转变为s2

//此时若是使用s1,则会编译错误
println!("{}",s1);

利用克隆操作可以解决这个问题,但是会多消耗一份空间,而且两个值是独立的。

1
let s2 = s1.clone()
将变量作为函数的参数和返回值
1
2
3
4
5
6
7
8
9
10
11
12
fn main(){
let s1 = String::from("hello");
//“hello”所有者进入函数sout内
sout(s1);
//此时“hello”,已经随着函数作用域的结束而清空
println("{}",s1);
}
fn sout(string:String){
println("{}",string)

//string作用域结束,“hello”跟着被清空
}
1
2
3
4
5
6
7
8
9
10
fn main(){
let s1 = make();
//所有者转移出来了。
}
fn make()->String {
let s1 = String::from("hello");

s1//作为返回值被返回,“hello”所有者转移
//作用域结束,但是“hello”所有者已经不是s1了,所以没有影响
}

所有权的借用

由于所有权的来回移动会造成各种问题,所有可以对所有权进行借用,也就是对值引用。

跟指针很像,使用 & + 变量名 来获得引用,不用担心所有权的转移。

但是引用分为不可变引用和可变引用。

不可变引用可以有很多个,类似读锁。

可变引用只能有一个,类似写锁。

当已有引用时,所有的可变引用都无法获取成功,并会报错。

当已有引用时,对所有者变量写操作也都无法成功。