rust的生命周期问题理解(一)

复制代码
fn main() {
    let mut a = String::new();
    let mut b = &mut a;
    println!("{:?}",a);
    b.push('a');
}
复制代码
error[E0502]: cannot borrow `a` as immutable because it is also borrowed as mutable
  --> src/main.rs:9:21
   |
8  |     let mut b = &mut a;
   |                 ------ mutable borrow occurs here
9  |     println!("{:?}",a);
   |                     ^ immutable borrow occurs here
10 |     b.push('a');
   |     - mutable borrow later used here
   |
   = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)

原因是a和b变量都指向同一个内存区域

a和b都对应同一个区域有write的权限。

println!("{:?}",a);这句话将对a进行不可变的借用

问题出在了10行。此行b是对a的一个可变借用。

第9行是对a的不可变借用,第10行是对a的可变借用。两者矛盾。编译报错。

同理是:

复制代码
fn main() {

    //
    let rc = Rc::new(vec![1, 2, 3]);

    // 创建一个共享引用
    let  mut rc_clone = Rc::clone(&rc);

    // 此时的引用计数为2,`make_mut` 会在需要修改时进行克隆
    // let mut binding = rc.clone();
    let rc_mut = Rc::make_mut(&mut rc_clone);

    // 现在可以安全地修改 `rc_mut`,原始的 `rc` 和 `rc_clone` 不受影响
    rc_mut.push(4);
    // println!("rc length: {:?}", Rc::strong_count(&rc));
    println!("rc: {:?}", rc);           // [1, 2, 3]
    println!("rc_clone: {:?}", rc_clone); // [1, 2, 3]
    // println!("rc_mut: {:?}", rc_mut);    // [1, 2, 3, 4]
    rc_mut.push(4);
}

rc_mut是对rc_clone的可变借用。

println!("rc_clone: {:?}", rc_clone);变成了对rc_clone的不可变借用

两者矛盾了。因此报错。

但是这里面Rc::make_mut(&mut rc_clone);调用结束了后,为什么还认为存在对rc_clone的可变借用呢?原因见chatgpt回答:

一个更简单的类似的例子是这个:

复制代码
fn test(b :& String) {
    println!("{:?}",b)
}

fn test2(b :&mut String) -> &mut String{
    b.push('b');
    println!("{:?}",b);
    return b;
}

fn main() {
    let mut a = String::new();
    let c = test2(&mut a);
    test(&a);
    a.push('a');
    c.push('b');
}

cannot borrow a as immutable because it is also borrowed as mutable 是什么错误,详细解释下

相关推荐
llwszx几秒前
Spring中DelayQueue深度解析:从原理到实战(附结构图解析)
java·后端·spring·delayqueue·延迟任务
YongGit15 分钟前
探索 AI + MCP 渲染前端 UI
前端·后端·node.js
charlie11451419125 分钟前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
77qqqiqi34 分钟前
正则表达式
java·后端·正则表达式
likeGhee1 小时前
python缓存装饰器实现方案
开发语言·python·缓存
whoarethenext1 小时前
使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
开发语言·c++·faiss
@大迁世界1 小时前
AR 如何改变我们构建网站的方式
后端·ar·restful
项目題供诗1 小时前
黑马python(二十五)
开发语言·python
RainbowSea1 小时前
问题:后端由于字符内容过长,前端展示精度丢失修复
java·spring boot·后端
慌糖2 小时前
RabbitMQ:消息队列的轻量级王者
开发语言·javascript·ecmascript