ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

rust Cell 与 RefCell的区别

2022-02-20 01:01:58  阅读:198  来源: 互联网

标签:mut trait borrow Cell RefCell rust


Cell与RefCell 的相同点:绕开所有权的限制,实现内部可变性性

rust 的所有权规则:

  • 只能由一个可变引用
  • 允许存在多个不可变引用
fn modify(a: &mut i32) {
    *x = *x + 1;
}

fn main() {
    let a =  111;
    modify(&mut a);
    
}

变量a定义成一个不可变的变量,不能用于modify函数中,如果知道rust所有权规则,你一定会说直接改成let mut a = 111;就完事了; 当存在即合理,有些场景是需要
允许对一个不可变变量进行修改的,这需要就需要Cell和RefCell出场了。

Cell主要是一些setter和getter的方法,比如set,get,replace,take, 但是呢,get的方法需要变量实现Copy trait,比如String类型没有实现Copy trait, 那么Cell::new(String::from("Hello")).get()会报错,提示说没有实现Copy trait。
而replace,set,take则适用于String这种没有实现Copy trait的类型。一般来说,Cell内部实现会发生内存的分配,性能较之RefCell有点大。

RefCell提供了borrow_mut和borrow,调用这两个方法时,rust的运行时会检查所有权,比如borrow_mut调用时,类型已经存在了可变引用了,则会直接发生线程panic,因此提供了返回错误的版本:try_borrow_mut和try_borrow

总结一下

两者的共同点是为了突破可变引用和引用不能共存的问题,不同点是:

  1. Cell 是操作T(values), RefCell操作&T(references)
  2. Cell 在编译器检查,运行时不会panic;RefCell在运行时检查,使用不当会发生panic

标签:mut,trait,borrow,Cell,RefCell,rust
来源: https://www.cnblogs.com/linyihai/p/15914361.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有