Rust引用借用测试

rust字面量字符串实现了copy trait;

String是引用类型,可使用clone创建新的对象;

Cell可修改copy trait对象;refcell可修改引用对象;

引用/借用对象有生命周期,超过生命周期自动归还引用/借用;

rust 复制代码
use std::cell::Cell;
use std::cell::RefCell;
use std::rc::Rc;
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let s1 = String::from("hello02");
	let s2 = format!("s2={}", s1);
	let s3 = s2.clone();
	let s4 = &s2;
    println!("Hello, world! {}", s1);
	println!("hell every one!{}", s2);
	println!("S3={}",s3);
	println!("&s2={}", s4);
	
	let cell_str = Cell::new("cellTest");
	println!("Initial value:{}", cell_str.get());
	cell_str.set("cellTest01");
	println!("Initial value:{}", cell_str.get());
	
	let str_value01 = "hello".to_owned();
	println!("str_value01={}", str_value01);
	test_str_fun(&str_value01);
	println!("str_value01={}", str_value01);
	
	let cell_string = RefCell::new("001".to_owned());
	{
	    cell_change_test02(&cell_string);
	    let text02 = cell_string.borrow();
	    println!("cell_string02={}", *text02);
	}
	cell_change_test03(&cell_string);
	let text03 = cell_string.borrow();
	println!("cell_string03={}", *text03);
	//RC测试 引用计数
	let vec = vec![1,2,3];
	let rc_data = Rc::new(vec);
	let rc_data1 = rc_data.clone();
    rc_data_test1(rc_data1);
	let rc_data2 = rc_data.clone();
	rc_data_test2(rc_data2);
	//RC+RefCell 引用计数+可修改
	let vec = vec![1,2,3];
    let rc_refcell_data = Rc::new(RefCell::new(vec));
	{
	    //独立开辟一个生命周期范围,让vec借用提前结束,方便后续代码继续使用vec对象
	    let mut vec03 = rc_refcell_data.borrow_mut();
	    vec03.push(4);
	}
	println!("{:?}", rc_refcell_data.borrow());
	
	//Arc测试 多线程只读
	let s = Arc::new(String::from("多线程测试"));
	for _ in 0..10 {
	    let si = Arc::clone(&s);
		let _handle = thread::spawn(move ||{
		    println!("{}", si);
		});
	}
	//多线程可变修改
	let counter = Arc::new(Mutex::new(0));
	let mut thread_list = vec![];
	for _ in 0..10{
	    let count_clone = Arc::clone(&counter);
		let handle_i = thread::spawn(move || {
		    let mut num = count_clone.lock().unwrap();
			*num += 1;
		});
		thread_list.push(handle_i);
	}
	
	for handle in thread_list{
	    handle.join().unwrap();
	}
	println!("Final count: {}", *counter.lock().unwrap());
}

fn rc_data_test1(data: Rc<Vec<i32>>){
	println!("data:{:?}", data);
}

fn rc_data_test2(data: Rc<Vec<i32>>){
    println!("data:{:?}", data);
}

fn test_str_fun(str: &String){
    println!("fun {}", str);
}

fn cell_change_test02(cell:&RefCell<String>){
    let mut text = cell.borrow_mut();
    *text = "002".to_owned();
}

fn cell_change_test03(cell:&RefCell<String>){
    let mut text = cell.borrow_mut();
    *text = "003".to_owned();
}
相关推荐
DongQiShanRen2 小时前
六根硬件映射(中):双站校验、生克闭环与驱动接口
数据库·人工智能·算法·rust·哈希算法·集成学习
Amos_Web2 小时前
Rspack 源码解析(二十五):CssParserAndGenerator 如何把 CSS 变成可 Tree Shaking 的模块
前端·rust·前端框架
Kainy3 小时前
Rust重写Photoshop开源项目PhotoCraft:无头命令行修图与AI Agent自动化实战
人工智能·rust·photoshop
I'm Jie3 小时前
Rhost v2.0.0 版本发布!!!不止 SSH 终端,内置 AI Agent 支持自然语言操作远程服务器
运维·服务器·rust·开源·ssh·tauri·finalshell
青川Lapis17 小时前
RUST:错误处理 thiserror 详解
rust
Source.Liu1 天前
【A11】拥有者模式平台架构笔记
windows·笔记·架构·rust
sayang_shao1 天前
用 Rust 开发 STM32H743:从零搭建一个能烧录、能看日志的项目
stm32·单片机·rust
qq_406981031 天前
大白话rust系列02原始数据类型
rust
遇码1 天前
macOS 触摸板捏合在 GPUI 里无响应:vendor 打补丁,把手势合成为 cmd+滚轮事件
rust·图形渲染·策略模式·桌面应用·gpui
geovindu1 天前
rust: Chain of Responsibility Pattern
开发语言·后端·设计模式·rust·责任链模式·行为模式