含义

拥有对某块内存区域的读写权限,同时也有义务释放该内存区域

共享引用

即对内存区域的读取权限,通过使用符号 & 获取一个共享引用,不会转移所有权

fn main() {
    let x = std::string::String::from("HelloWorld"); //x拥有对内存区域("HelloWorld")的读写权限
    println!("{}", &x);//可以通过使用 & 符号从x处读取 x依然拥有所有权
}
fn main() {
    let x = std::string::String::from("HelloWorld");
    let y = x;//所有权转移到了y
    println!("{}", &x);//❌报错,x已经没有对那块内存区域("HelloWorld")的所有权(读写权限)了
}

同一时刻某个内存区域可以拥有多个共享引用

fn main() {
    let mut x = std::string::String::from("HelloWorld");
    let a = &x;
    let b = &x;
    println!("{} {}",a,b);
}

可写引用

即对内存区域的写权限,不会转移所有权

fn main() {
    let mut x = std::string::String::from("HelloWorld");
    x.push('!');// 可以修改
    println!("{}",x);
}

同一时刻某个内存区域只能有一个可写引用

fn main() {
    let mut x = std::string::String::from("HelloWorld");
    let a = &mut x;
    let b = &mut x; //❌cannot borrow `x` as mutable more than once at a time
    a.push('a');
}

共享引用、可写引用总结

  • 同一时刻要么有N个共享引用、要么只有一个可写引用
  • 无论是获取共享引用还是获取可写引用,都不会发生所有权转移,目标内存区域依然在拥有所有权的变量的生命周期结束时释放

拥有读写权利,也拥有释放义务

fn main() {
    {
        let a = String::from("Hello");
        //a的整个生命周期就在这个内层括号里
    }
    println("{}",a); //❌ 这里访问不了的,因为a的生命早已结束,其管理的("Hello")也早已被释放
}
fn main() {
    let b:String;
    {
        let a = String::from("Hello");
        b=a;// 将权力转移出去,即使 a的生命结束了,("Hello")也不会被释放,因为a把所有权(管理权)交出去了
    }
    println!("{}",b);//b拥有对("Hello")对所有权,自然拥有读权限
}