mut a: &mut i32

mut a表示a可变,可以被重新绑定
&表示(不可变)引用 &mut表示可变引用,即*a可变,可以被重新绑定

测试验证代码

fn change_i_mut_ref(i:&mut i32){
    *i=2; // 给引用绑定新值,i 不可变,*i 指向的变量可变
}

// fn change_i_mut_ref_err(i:&mut i32){
//     i=xxxx; // i 不可变,不可重新绑定,等于什么都不行
// }

fn change_mut_i(mut i:i32){
    i=4;
}

fn change_mut_i_ref(mut i:&i32){
    i=&5;
}

fn change_mut_i_mut_ref_change_i(mut i:&mut i32){
    // i=&5; //会报错,因为 &5 的类型是 &i32, &mut 5 的类型是 &mut i32
    // i=&mut 5; //一样会报错,因为 &mut 5 生命周期仅在函数内,函数返回后,i引用的值会被回收
}

fn change_mut_i_mut_ref_change_ref(mut i:&mut i32){
    *i=7;
}

#[tokio::test]
async fn my_test1()-> crate::Result<()> {
    let mut i=1i32;
    println!("{}",i);
    change_i_mut_ref(&mut i);// 这里需要传 &mut i, &i的类型是 &i32, 不是 &mut i32,同时i需要是mut i,不可变变量不可转化为可变引用
    println!("{}",i);
    change_mut_i(i);//修改失败
    println!("{}",i);//修改失败
    change_mut_i_ref(&mut &i);
    println!("{}",i);//修改失败
    change_mut_i_mut_ref_change_i(&mut i);
    println!("{}",i);//修改失败
    change_mut_i_mut_ref_change_ref(&mut i);
    println!("{}",i);//修改成功,和change_i_mut_ref等效
    Ok(())
}