4. Rust基件:RefCell

幻灰龙 幻灰龙 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

上一条: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();
}

 

...全文

相关推荐

atomic_refcell:用于Rust的线程安全RefCell

atomic_refcell 用于Rust的线程安全RefCell。

moseswangbp981

qcell-RefCell的静态检查替代品-Rust开发

静态检查的RefCell替代品RefCell的替代品,而不是在运行时出现惊慌,将产生编译错误。 文档静态检查的RefCell替代品RefCell的替代品,而不是在运行时出现恐慌,将产生编译错误。 文档请参阅包装箱文档。 许可证您可以选择根据Apache许可证版本2或MIT许可证对本项目进行许可。 (请参阅LICENSE-APACHE和LICENSE-MIT)。 贡献除非您明确声明,否则您有意提交任何包含在您的板条箱中的贡献,如Apache-2.0中所定义

崔迪潇

38 014RefCell介绍.mp4

38 014RefCell介绍.mp4

yike666

《Rust in Action》 by Timothy Samuel McNamara

Rust in Action 是一本面向想要探索 Rust 编程语言世界的中级程序员的书。它适用于可能已经用尽网络上的免费资料但仍想了解更多信息的人。它与 Rust 编程的其他材料不同,因为它还教您有关系统编程的知识。您将能够更多地了解 CPU 的工作原理、计算机如何计时、指针是什么以及您的网卡和键盘如何告诉 CPU 它们已准备好读取输入。 从系统编程书籍的角度来看,它实际上也是独一无二的 - 因为几乎每个示例都适用于 Windows!如果你是那种喜欢实际例子的学习者,你会喜欢阅读这本书。

0x0007

《Rust in Action》 by Timothy Samuel McNamara(PDF文档)

《Rust in Action》 by Timothy Samuel McNamara(PDF文档) Rust in Action 是一本面向想要探索 Rust 编程语言世界的中级程序员的书。它适用于可能已经用尽网络上的免费资料但仍想了解更多信息的人。它与 Rust 编程的其他材料不同,因为它还教您有关系统编程的知识。您将能够更多地了解 CPU 的工作原理、计算机如何计时、指针是什么以及您的网卡和键盘如何告诉 CPU 它们已准备好读取输入。 从系统编程书籍的角度来看,它实际上也是独一无二的 - 因为几乎每个示例都适用于 Windows!如果你是那种喜欢实际例子的学习者,你会喜欢阅读这本书。 收起

轩轩软件
评论
收藏 已收藏
分享
返回顶部
幻灰龙
10x Rust 1,726 成员 130 内容