rust储物箱怎么带走_Rust-Rc-方法整理

news/2024/10/17 22:22:42/

ref: alloc::rc::Rc – Rust

方法

new

pin

try_unwrap

into_raw

from_raw

downgrade

weak_count

strong_count

get_mut

ptr_eq

make_mut

downcast

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)); // 不会打印

}


http://www.ppmy.cn/news/533345.html

相关文章

基于单片机的超市储物柜设计_基于51单片机对电子储物柜系统的设计

电路描述: 安全是我们日常的生活中最关心的问题。 每个人都觉得安全问题是非常至关重要的,在家里的门和安全,可以尽可能多的安全。 为了对于门访问安全 因此,我们打算通过引进一个电子密码锁系统,该系统包括一个人得到一个访问某些项目之前要输入密码的安全性,以及在家里…

基于单片机的超市储物柜设计_毕业设计论-单片机储物柜

I 超市储物柜系统驱动板设计 摘 要 在空间狭小、物品繁多的室内场合,传统的储物柜和物品管理方式显得捉襟 见肘。在通过利用室内高处空间、提高物品摆放密度等方法,提高物品的利用率。 同时也会对整套储物系统的易用性、自动化程度提出更高的要求。然而超…

部品se分析_汽车储物箱部品模具,二色产品模具专业厂

汽车储物箱部品模具 PVC塑料型材挤出模具是挤出生产线的核心部分,它包括口模(又称模头)、定型模、冷却水箱等。口模通过法兰盘与挤出机机头上的法兰盘组装在一起,安装加热圈、加热板,接通电源和热电偶。定型模和冷却水箱装用螺钉固定在定型台,上,而且接通水管、气管。挤出…

39_ue4进阶末日生存游戏开发[增加储物箱]

需求: 首先赋值一份bag的ui 重命名为cabinet 重命名为cabpanel 然后按住shiftctrl设置锚点 我们往右微调一下 背包改成储物箱 又蹭了两个免费箱子的模型,但是第一个跟4.19版本不兼容 现在创建一个箱子蓝图,命名为Cabinet 添加静态模型组件&am…

使用Java语言模拟超市储物箱案例

需求:有存包和取包两种操作。 系统初始化有一系列的储物格, 存包动作生一个密码, 并占用一个储物格; 取包时验证输入储物格编号以及密码,正确则清空储物格。 import java.util.Random; import java.util.Scanner;publi…

指针与储物箱的关系

指针类型是C、Pascal等语言中比较重要的数据类型。在使用上很灵活。在C中可以使用如下的语句一个int指针类型: int * p; 如果要为指针变量赋值,可以使用如下的语句: int x 4 ; int * p; p & x; 对于初学者来说,可…

NGUI官网示例13 –Character角色装配与储物箱(三)

该部分主要是为实现装备在拖动的时候出现拖动图标的效果和当鼠标放置在装备上时提示装备的一些信息而做准备。 使用UI Tool创建一个Simple 2D UI层级结构,其Layer为2DGUI,我们通过不同的图层的设置让摄像机只显示我们设定的图层中的对象,有点…

Linux5.8 MySQL主从复制与读写分离

文章目录 计算机系统5G云计算第四章 LINUX MySQL主从复制与读写分离一、概述及原理1)什么是读写分离2)为什么要读写分离呢3)什么时候要读写分离4)主从复制与读写分离5)mysql支持的复制类型6)主从复制的工作…