所有权:在数据生命周期中,拥有对数据的访问操和作权限。
从以下几个维度去理解
- 生命周期:从数据的诞生到消失
- 访问权限,读取数据权限
- 操作权限:修改数据,删除数据的权限
动态地看待以上3者的关系,如:生命周期的有长短,在操作一个数据期间,不允许读取,这样容易引发数据不一致。
从集合去理解所有权:
- T 包括 &T, &mut T,
- 其中&T 与 &mut T 无交集,不可同时存在
- 所有权会发生变化转移,所有权转移表现为2种方式:移动 or 复制(Copy 特征)
- 如:数值,bool, 字符当所有权发生移动时,会进行复制
- 声明一个变量,默认不可变。
借用规则:
- 有借有还:借出了,就要问什么时候归还,是否可再借
- 共享不可借出可变,可变可借出共享:包含性,派生
- 可变引用,共享引用,不可以同时存在。数据的唯一性,是否排它
pub async fn get_ownership_demo() {
let a = 2;
// 实现copy特征,所有权发生移动,直接复制而不是转移
let mut b = a;
// 修改
b += 3;
// 不可从不可变借出可变
// let mut d = & &mut a;
// 打印出指针
// println!("&mut &i32: {:p}", d);
let d = & &mut b;
// 上一次出借可变给d, 尽管是不可变再借用
// 也是会视作一次可变的出借, 这样同时存在2次可变引用
// let e = &mut b;
// 作用域
{
// let g = b;
// drop 释放
}
println!("a: {}, d: {}", a, d);
let mut visible = true;
// 发生复制
let toggle = visible;
let ls = vec![1,2,3];
let arr = ls;
// 所有权发生移动,给到arr,此时是未定义
// println!("ls: {:?}", ls);
println!("arr: {:?}", arr);
visible = false;
println!("visible: {}, toggle: {}", visible, toggle);
}