std::rc::Rc 是单线程引用计数指针。'RC' 代表 'Reference Counted'。

翻阅 module-level-documentation 查看更多信息

Rc 的固有方法都是关联函数,这意味在使用应该是用类似 Rc::get_mut(&mut value) 而不是 value.get_mut() 的方式调用。这可以避免与其包含的类型方法冲突。

方法

new

pub fn new(value: T) -> Rc

构造一个 Rc

例子

use std::rc::Rc;

let five = Rc::new(5);

pin

pub fn pin(value: T) -> Pin>

构建一个新的 Pin>。如果 T 没有实现 Unpin,那么 value 将会固定在内存中不可移动。

try_unwrap

pub fn try_unwrap(this: Self) -> Result

如果 Rc 有且只有1个强引用,则返回包含的值,否则返回 Err。

不管 Rc 有多少弱引用,只要符合上述条件,该函数都将成功。

use std::rc::Rc;

fn main() {

let x = Rc::new(3);

assert_eq!(Rc::try_unwrap(x), Ok(3));

let x = Rc::new(4);

let _y = Rc::clone(&x); // 调用 clone 增强强引用

assert_eq!(*Rc::try_unwrap(x).unwrap_err(), 4); // Rc::try_unwrap(x) 返回 Err(4)

}

into_raw

pub fn into_raw(this: Self) -> *const T

消费 Rc, 返回被包装的指针。

为了避免内存泄漏,被包装的指针如果要被重新转换为 Rc, 应该使用 Rc::from_raw

例子

use std::rc::Rc;

fn main() {

let x = Rc::new(4);

let x_ptr = Rc::into_raw(x); // x_ptr 为裸指针 0x142fdcde020

assert_eq!(unsafe { *x_ptr }, 4);

}

from_raw

pub unsafe fn from_raw(ptr: *const T) -> Self

从裸指针中构建一个 Rc。

裸指针必须是从 Rc::into_raw 中返回的裸指针。

这个函数是不安全的,因为不正确使用可能会导致内存问题。例如,在裸指针上二次释放资源。

use std::rc::Rc;

let x = Rc::new(10);

let x_ptr = Rc::into_raw(x);

unsafe {

// 转换成 Rc 避免内存泄漏

let x = Rc::from_raw(x_ptr);

assert_eq!(*x, 10);

// 再次调用 `Rc::from_row(x_ptr)` 会导致内存不安全

}

// `x` 的内存将会在离开作用域后释放,所以 `x_ptr` 不是悬吊指针

downgrade

pub fn downgrade(this: &Self) -> Weak

创建一个被包裹值的弱引用指针

例子

use std::rc::Rc;

let five = Rc::new(5);

let weak_five = Rc::downgrade(&five);

weak_count

返回弱引用计数

例子

use std::rc::Rc;

let five = Rc::new(5);

let _weak_five = Rc::downgrade(&five);

assert_eq!(1, Rc::weak_cont(&five));

strong_count

返回强引用计数

例子

use std::rc::Rc;

let five = Rc::new(5);

let _also_five = Rc::clone(&five);

assert_eq!(2, Rc::strong_count(&five));

get_mut

如果没有其他 Rc 或者 Weak 指针指向内部值,则返回内部值的可变引用,否则返回

None,因为改变共享值是不安全的。

另见 make_mut,这方法会在内部值处于共享状态时克隆内部值。

例子

use std::rc::Rc;

let mut x = Rc::new(3);

*Rc::get_mut(&mut x).unwrap() = 4;

assert_eq!(*x, 4);

let _y = Rc::clone(&x);

assert!(Rc::get_mut(&mut x).is_none());

ptr_eq

判断两个指针是否指向同一个值

例子

use std::rc::Rc;

let five = Rc::new(5);

let same_five = Rc::clone(&five);

let other_five = Rc::new(5);

assert!(Rc::ptr_eq(&five, &same_file));

assert!(!Rc::ptr_eq(&five, &other_file));

make_mut

pub fn make_mut(this: &mut Self) -> &mut T

创建一个 Rc 的可变引用。如果 Rc 还有其他引用或弱引用,make_mut 将会克隆内部值以保证所有权的唯一性。这也被称为写时克隆。

另见 get_mut,这个方法会失败而不是克隆

例子

use std::rc::Rc;

let mut data = Rc::new(5);

*Rc::make_mut(&mut data) += 1; // 不会克隆

let mut other_data = Rc::clone(&data); //此时还未复制

*Rc::make_mut(&mut data) += 1; // 复制内部数据

*Rc::make_mut(&mut data) += 1; // 复制后再次调用原指针将不会触发克隆

*Rc::make_mut(&mut other_data) *= 2;

// 现在 `data` 和 `other_data` 指向不同值

assert_eq!(*data, 8);

assert_eq!(*other_data, 12);

downcast

pub fn downcast(self) -> Result, Rc>

尝试将 Rc 降级为具体值

例子

use std::any::Any;

use std::rc::Rc;

fn print_if_string(value: Rc) {

if let Ok(string) = value.downcast::() {

println!("String ({}): {}", string.len(), string);

}

}

fn main() {

let my_string = "Hello World".to_string();

print_if_string(Rc::new(my_string));

print_if_string(Rc::new(0i8)); // 不会打印

}

rust灯灭了怎么办_Rust Rc 方法整理相关推荐

  1. 学习总结——按下按键灯亮,再次按下按键,灯灭

    按键控制灯的亮灭 1 主要实现按键控制灯的亮灭,按键按下,灯亮,再次按下,灯灭,主要对实现的逻辑进行控制,逻辑清晰,很简单,实现的方法有两种,方法1:将按键按下的值赋值给一个变量,变量除以2的值的是基 ...

  2. american主板网卡灯关机后还亮_安装黑苹果出问题,安装到最后一分钟黑屏,硬盘灯灭了后重启进苹果系统卡死,有图。...

    2012-9-24 00:43 上传 下载附件 (169.1 KB) 主板设置: 开启SATA的AHCI模式.在BIOS中将主板的集显关闭.预设显示设备选为"PEG" 上图 在BI ...

  3. c语言按键亮灯再按不亮,按一次按键灯亮,再按一次灯灭

    /*此为自已写的, 功能:实现按一次按键灯亮,再按一次灯灭 欢迎仿问我的空间http://378621667.qzone.qq.com里头有好多单片机C语言代码 2011年10月24于厦门软件园二期 ...

  4. 单灯控制器常见故障及处理方法

    单灯控制器常见故障及处理方法 常见故障现象: 上电后,灯不停闪烁 故障出现原因: 接线不正确,接触不良 灯具不良 处理方法: 检查控制器与灯具接线是否正确,接触是否良好 更换灯具验证 常见故障现象: ...

  5. 浪潮服务器2012系统网卡不亮,Win7系统网卡灯不亮的原因和解决方法

    如今网络普及,我们电脑的网络都需要用到网卡,而网卡故障也经常发生,正常情况下网卡灯是闪烁的,可是有win7 32位系统用户却发现网卡灯不亮,这是什么原因呢?接下来给大家讲解一下Win7系统网卡灯不亮的 ...

  6. linux网卡灯不亮怎么处理,电脑网卡灯不亮的原因及解决方法

    随着宽带的普及,网卡成为了电脑与网络的一道桥梁,但网卡故障也时有发生,正常的情况下,网卡灯是闪烁的,不同的闪烁法代表这不同的网络状况,若是网卡灯不亮怎么办呢?造成网卡灯不亮的原因有很多,下面就给大家介 ...

  7. matlab led 指示灯,LED灯三种常见故障及解决方法

    LED灯以其亮度大.耗能低.寿命长等特点,逐步霸占当今电灯市场.一般来说,LED灯是很难发生问题的,在LED灯的问题中,不外乎三种毛病:灯不亮.灯变暗.关灯后闪烁.今天我们来逐条分析解决各项问题. L ...

  8. 多普达硬启动方法整理

    多普达硬启动方法整理 老张手机网 / 2010-04-16 [大] [中] [小] 硬起前注意事项: 1.备份手机里的资料,如:联系人.彩信.短信.手机的资料等信息,平时养成定期备份资料的习惯: 2. ...

  9. 零基础快速学习Java技术的方法整理

    在学习java技术这条道路上,有很多都是零基础学员,他们对于java的学习有着很多的不解,不知怎么学习也不知道如何下手,其实Java编程涉及到的知识点还是非常多的,我们需要制定java学习路线图这样才 ...

最新文章

  1. ptyhon时间处理
  2. css高级教程第一章笔记
  3. python入门--函数
  4. 小腿训练三部曲(二)
  5. redis的多路复用是什么鬼
  6. Javascript设计模式之发布-订阅模式
  7. 开源TinyXML 最简单的新手教程
  8. 赚钱的过程,也是合作的过程
  9. Java-Lambda表达式第二篇认识Lambda表达式
  10. co2激光切割机控制系统上位机C#源码,stm32f407控制板源码,可用于雕刻机,切割机,写字机,点胶机
  11. win7获取计算机管理员权限,Win7获取管理员权限的方法
  12. 专访Wunderlist主设计师Jan Martin:永远不要盲目跟风流行趋势1
  13. 2022年电梯考试电梯检验员模拟题及答案
  14. Unity 人物描边解决方案
  15. Hexo主题制作指南
  16. Bit-M Accelerator全新上线
  17. 云计算具有哪些优势 如何快速系统学习云计算
  18. office@microsoft365@官方在线安装@第三方离线下载并安装(word+ppt+excel)
  19. JavaScript - 语言提高
  20. 如何开发手游联运平台?

热门文章

  1. Struts2--DomainModel接收参数---使用广泛!!!
  2. javascript6
  3. C#.NET 可以为不同的客户定制不同的登录窗体的设计思路参考【功能代码组件化,可以灵活选配】...
  4. 使用UI Automation实现自动化测试 --工具使用
  5. WebAPi的可视化输出模式(RabbitMQ、消息补偿相关)——所有webapi似乎都缺失的一个功能...
  6. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值
  7. C# MD5加密解密帮助类
  8. 导入Excel表里的数据时产生【定义了过多字段】,但有时又是成功的
  9. 页面事务处理 ContextUtil.SetComplete(); 没有 MTS 对象上下文
  10. 在使用模板时遇到的错误,TypeError at /index/ context must be a dict rather than RequestContext(亲测)