rust 【入门】04- 所有权

37 阅读2分钟

所有权:在数据生命周期中,拥有对数据的访问操和作权限。

从以下几个维度去理解

  1. 生命周期:从数据的诞生到消失
  2. 访问权限,读取数据权限
  3. 操作权限:修改数据,删除数据的权限

动态地看待以上3者的关系,如:生命周期的有长短,在操作一个数据期间,不允许读取,这样容易引发数据不一致。

从集合去理解所有权:

  1. T 包括 &T, &mut T,
  2. 其中&T 与 &mut T 无交集,不可同时存在
  • 所有权会发生变化转移,所有权转移表现为2种方式:移动 or 复制(Copy 特征)
  • 如:数值,bool, 字符当所有权发生移动时,会进行复制
  • 声明一个变量,默认不可变。

借用规则:

  1. 有借有还:借出了,就要问什么时候归还,是否可再借
  2. 共享不可借出可变,可变可借出共享:包含性,派生
  3. 可变引用,共享引用,不可以同时存在。数据的唯一性,是否排它
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);
}