4. Rust基件:RefCell

幻灰龙 2021-06-08 11:03:16

上一条:Cell 下一条:Mutex/RwLock


对于没有实现`Copy`的类型,例如`String``Vec<T>`,要实现多个不可变借用内部成员的可变性,就需要使用`RefCell<T>`,常用方法主要是

  • 获得内部T的不可变借用:使用`borrow()`方法
  • 获得内部T的可变借用:使用`borrow_mut()`方法

虽然获得了对不可变借用内部成员的可变修改能力,但是借用的规则然起作用,下面是一组单元测试,注意RefCell的借用规则在编译期不会检查,但是运行期会检查,如果违反会在运行期 panic

测试1:x 一旦borrow_mut,就不可同时 borrow

fn test1(){
    let x = RefCell::new(5);
    let a = x.borrow(); 
    let b = x.borrow_mut(); // 运行期 panic
}

测试2:x 的borrow可多次

fn test2(){
    let x = RefCell::new(5);
    let a = x.borrow(); 
    let b = x.borrow();
}

测试3:y 是 x的clone,x 和 y 都可多次borrow

fn test3(){
    let x = RefCell::new(5);
    let a = x.borrow(); 
    let b = x.borrow();
    
    let y = x.clone();
    let c = y.borrow();
    let d = y.borrow();
}


测试4:y 是 x的clone,x 和 y 一起,只能有一个borrow_mut

fn test4(){
    let x = RefCell::new(5);
    let a = x.borrow_mut(); 

    let y = x.clone();
    let c = y.borrow_mut();// 运行期 panic
}


测试5:y 是 x的clone,x 和 y 一起,可多次borrow

fn test5(){
    let x = RefCell::new(5);
    let a = x.borrow(); 

    let y = x.clone();
    let c = y.borrow_mut();
}

 

测试6:y 是 x的clone,x 和 y 一起,只能有一个borrow_mut,可变借用在超出作用域后归还,即可再次可变借用

fn test6(){
    let x = RefCell::new(5);
    let y = x.clone();
    
    {
        let a = x.borrow_mut();     
    }
    
    let c = y.borrow_mut();
}

 

...全文
3208 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,725

社区成员

发帖
与我相关
我的任务
社区描述
Rust是新一代大规模底层系统平台开发的强力选项,拥有现代的类型系统,精确的生命周期控制,流畅的表达力和错误处理,以及明晰的异步编程范式。
rust 个人社区
社区管理员
  • 幻灰龙
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
社区主要目的: 1. 讨论Rust的核心语法语义 2. 讨论Rust的编程范式、最佳实践。 3. 讨论10x创新技术

试试用AI创作助手写篇文章吧