Rust中mut, &, &mut的区别

资源:内存区块。不同的内存区块位置和大小就是不同的资源。

str

let a = "xxx".to_string();  
含义:a绑定到字符串资源A上,拥有资源A的所有权

let mut a = "xxx".to_string(); 
含义:a绑定到字符串资源A上,拥有资源A的所有权,同时a还可绑定到新的资源上面去(更新绑定的能力,但新旧资源类型要同);

value

let b = a;
含义:a绑定的资源A转移给b,b拥有这个资源A

let b = &a;  
含义:a绑定的资源A借给b使用,b只有资源A的读权限

let b = &mut a;  
含义:a绑定的资源A借给b使用,b有资源A的读写权限

let mut b = &mut a;  
含义:a绑定的资源A借给b使用,b有资源A的读写权限。同时,b可绑定到新的资源上面去(更新绑定的能力)

String
fn do(c: String) {}  
含义:传参的时候,实参d绑定的资源D的所有权转移给c

fn do(c: &String) {}  
含义:传参的时候,实参d将绑定的资源D借给c使用,c对资源D只读

fn do(c: &mut String) {}  
含义:传参的时候,实参d将绑定的资源D借给c使用,c对资源D可读写

fn do(mut c: &mut String) {}  
含义:传参的时候,实参d将绑定的资源D借给c使用,c对资源D可读写。同时,c可绑定到新的资源上面去(更新绑定的能力)

函数参数里面,冒号左边的部分,mut c,这个mut是对函数体内部有效;冒号右边的部分,
&mut String,这个 &mut 是针对外部实参传入时的形式化(类型)说明。

练习

fn main() {
    // 初始化v
    let mut v = vec![1,2,3];
    let mut mv = &mut v;
    mv[0]=100;
     // 初始化v1
    let mut v1 = vec![5,6,7];
    println!("mv{:?}",&mv);
    mv = &mut v1;
    println!("mv{:?}",&mv);

    // 报错, 提示在借用的过程中变量已经释放, 建议直接使用let... 创建一个更长的生命周期,
    // 即 直接 let mut v2 = vec![8,9,10]; 或 再其后添加 mv = &mut mv
    //mv = &mut vec![8,9,10];

    // 修改后
    let mut v2 = vec![8,9,10]; 
    mv = &mut v2;
    
    println!("mv{:?}",&mv);
}

————————————————
版权声明:本文为CSDN博主「rayylee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hbuxiaofei/article/details/108471806

posted @ 2023-03-17 17:08  Heath Leger  阅读(143)  评论(0编辑  收藏  举报