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 是什么错误,详细解释下

相关推荐
hixiong1233 分钟前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#
修己xj11 分钟前
IDEA 报错 “Command line is too long” 的解决方法
后端
子兮曰15 分钟前
DeepSeek TUI:原生 Rust 打造的终端 AI 编码 Agent
前端·javascript·后端
DFT计算杂谈28 分钟前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
子兮曰31 分钟前
深入 Superpowers:180k Stars 的开源 AI 编程方法论是如何工作的
前端·javascript·后端
苍何39 分钟前
我逆向了 329 条 GPT-Image2 提示词模板,全部开源!
后端
苍何43 分钟前
我用多Agent搭了一家跨境电商公司,起飞!
后端
EW Frontier1 小时前
6G ISAC新范式:基于智能漏波天线的Wi‑Fi通感一体化系统设计与实测【附MATLAB+python代码】
开发语言·python·matlab·music·isac·doa·wi‑fi
Rik1 小时前
用 AI Skill 封装你的工作流:从代码规范到全流程提效实战
前端·后端
楼田莉子1 小时前
Linux网络:NAT_代理
linux·运维·服务器·开发语言·c++·后端