- 浏览: 767913 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
Box,Rc,RefCell都是不可变借用,只不过RefCell是运行时检查,Box和RefCell是可变的,Rc不可变但同一个数据可以有多个拥有者
Box<T>类型具有已知大小并指向在堆上分配的数据。该 Rc<T>类型跟踪堆上数据的引用次数,以便数据可以有多个所有者。具有内部可变性的RefCell<T>类型为我们提供了一种类型,当我们需要不可变类型但需要更改该类型的内部值时可以使用该类型;它还在运行时而不是在编译时强制执行借用规则
Box<T>类型具有已知大小并指向在堆上分配的数据。该 Rc<T>类型跟踪堆上数据的引用次数,以便数据可以有多个所有者。具有内部可变性的RefCell<T>类型为我们提供了一种类型,当我们需要不可变类型但需要更改该类型的内部值时可以使用该类型;它还在运行时而不是在编译时强制执行借用规则
use std::ops::Deref; use std::rc::Rc; use std::cell::RefCell; enum List { Cons(i32, Box<List>), Nil, } #[derive(Debug)] enum RcList { RcCons(Rc<RefCell<i32>>, Rc<RcList>), RcNil, } use crate::RcList::{RcCons, RcNil}; use crate::List::{Cons, Nil}; struct MyBox<T>(T); impl<T> MyBox<T> { fn new(x: T) -> MyBox<T> { MyBox(x) } } impl<T> Deref for MyBox<T> { type Target = T; fn deref(&self) -> &Self::Target { &self.0 } } fn hello(name: &str) { println!("Hello, {}!", name); } struct CustomSmartPointer { data: String, } impl Drop for CustomSmartPointer { fn drop(&mut self) { println!("Dropping CustomSmartPointer with data `{}`!", self.data); } } fn main() { //普通智能指针 let num = Box::new(10); println!("{}",num); let list = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil)))))); let mut x = 5; let mut y = &x; println!("y:{}",*(y.deref())); let z = Box::new(x); //z = Box::new(11); //*y = 10; //借用不能修改 //x = 10; assert_eq!(5, x); assert_eq!(5, *y); let m = MyBox::new(String::from("Rust")); hello(&m); hello(&(*m)[..]); let c = CustomSmartPointer { data: String::from("my stuff"), }; //c.drop(); //不能手动调用 let d = CustomSmartPointer { data: String::from("other stuff"), }; println!("CustomSmartPointers created."); let value = Rc::new(RefCell::new(5)); let a = Rc::new(RcCons(Rc::clone(&value), Rc::new(RcNil))); let b = RcCons(Rc::new(RefCell::new(3)), Rc::clone(&a)); let c = RcCons(Rc::new(RefCell::new(4)), Rc::clone(&a)); *value.borrow_mut() += 10; println!("a after = {:?}", a); //这个时候a的值就变了 println!("b after = {:?}", b); println!("c after = {:?}", c); let r = Rc::new(100); let r1 = r; let r2 = r1; println!("r:{}",Rc::strong_count(&r2)); } 10 y:5 Hello, Rust! Hello, Rust! CustomSmartPointers created. a after = RcCons(RefCell { value: 15 }, RcNil) b after = RcCons(RefCell { value: 3 }, RcCons(RefCell { value: 15 }, RcNil)) c after = RcCons(RefCell { value: 4 }, RcCons(RefCell { value: 15 }, RcNil)) Dropping CustomSmartPointer with data `other stuff`! Dropping CustomSmartPointer with data `my stuff`!
发表评论
-
模式匹配
2022-03-27 17:35 174fn main() { //if let ... -
rust mutex
2022-03-27 12:14 223use std::sync::{Arc,Mutex}; ... -
rust channel
2022-03-27 11:58 240use std::sync::mpsc; use std ... -
test框架
2022-03-25 10:18 233#[derive(Debug)] struct Rect ... -
lifeCycle
2022-03-24 14:10 161fn longest<'info>(x: &a ... -
hashmap
2022-03-24 11:11 175use std::collections::HashMap ... -
rust map
2020-08-18 16:02 509fn test_map(){ let a=[1, ... -
rust call
2020-08-13 10:27 348fn call<F>(clousure:F) ... -
rust闭包
2020-08-12 11:00 262返回闭包 fn returns_closure() -&g ... -
rust cell
2020-08-06 11:47 230fn test_cell(){ use std: ... -
rust引用记数
2020-08-06 11:10 325fn test_ref(){ use std:: ... -
rust内存泄漏
2020-08-03 10:20 458原因主要有三种: 1.线程崩溃,析构无法调用 2.使用引用记数 ... -
rust as类型转换
2020-07-24 10:34 589fn testAs(){ let a = 1u3 ... -
rust 线程 spawn
2020-07-24 10:03 306use std::thread; use std::ti ... -
rust println!
2020-07-20 11:09 351fn testPrintln(){ printl ... -
rust trait
2020-07-16 20:27 275使用trait可以让不用的类型实现同一个行为,定义函数的默认实 ... -
rust 范型
2020-07-15 20:00 275fn testOption(){ let i : ... -
rust 优先队列BinaryHeap
2020-07-15 09:22 863Rust提供的优先队列是基于二叉最大堆实现的 fn te ... -
rust set
2020-07-15 09:23 491HashSet<K>和BTreeSet<K& ... -
rust map
2020-07-15 09:23 322BTreeMap是有序的,HashMap是无序的 fn ...
相关推荐
本资源总结了Rust中的常见智能指针用法,和示例代码。 例如Box,Raw Pointer裸指针 Rc计数指针 Cell与RefCell内部可变性 Weak指针 Arc原子计数指针 和Mutex锁 的用法和示例
Rust智能指针,用于Objective-C参考计数。 为了确保在适当的时间保留和释放Objective-C对象,我们可以使用Id结构。 要实施别名规则,可以拥有或共享一个Id ; 如果它是拥有的,则意味着Id是对该对象的唯一引用,...
### 深入Rust的智能指针:内存安全的得力助手 #### 1. 智能指针简介 智能指针是Rust语言中的一种重要特性,旨在为开发者提供安全且高效的堆上数据操作方式。智能指针不仅能够帮助管理内存,还能在编译时提供额外的...
4. Rust智能指针:Rust学习笔记Day 13-15讲述了Rust的智能指针,包括Box、Cow等智能指针的使用和实现。 5. Rust集合容器:Rust学习笔记Day 16-19讲述了Rust的集合容器,包括数组、链表、哈希表等集合容器的使用和...
第二章详细介绍了 Rust 的内存管理机制,包括所有权系统、借用检查器、智能指针等概念。 第三章讲解了 Rust 的并发编程机制,包括线程、异步编程、 Atomic 类型等。 第四章介绍了 Rust 的 error handling 机制,...
碎纸机 shredder是一个提供垃圾回收智能指针Gc 。 这在您希望共享访问某些数据但数据结构中具有不可预测的周期时非常有用。 (因此,Arc不适合。) shredder具有以下功能: 安全:即时检测错误情况,并保护您免受...
2. **类型系统**:深入讨论Rust的类型系统,包括静态类型、枚举、结构体、元组、引用和智能指针。Rust的类型系统是其强大安全性的重要组成部分。 3. **函数和闭包**:讲解Rust中的函数定义、参数传递、返回值以及...
9. **智能指针**:如`Box`、`Rc`、`Arc`等,它们是Rust中对内存管理的高级抽象,提供了垃圾回收的类似功能,但仍然保持了高性能。 10. **Cargo**:Rust的标准构建和包管理工具,它负责管理依赖、构建项目以及运行...
本章将深入探讨 Rust 中的指针类型及其用法,包括智能指针、生命周期等概念,这些都是 Rust 高级特性的重要组成部分。 #### 第三部分:高级部分 这一部分涉及 Rust 的一些高级特性,如更复杂的类型系统、异步编程...
【Rust在飞书客户端的智能化探索】 在互联网行业中,技术的发展日新月异,而Rust作为一种系统级编程语言,近年来受到了广泛的关注。RustChinaConf2020的议题“Rust在飞书客户端的智能化探索”深入讨论了Rust如何在...
Rust 的内存管理机制确保了零成本抽象和无悬挂指针,这使得它在处理硬件资源有限的嵌入式系统时,能够避免常见的编程错误,如空指针异常和数据竞争。此外,Rust 的静态类型和所有权模型确保代码在编译时就能捕获许多...
智能指针是Rust中一种特殊的类型,它可以拥有它指向的数据。 Rust支持面向对象编程,它提供特质对象(trait objects)来实现动态分派。在Rust中可以实现设计模式,例如单例模式、策略模式等。 Rust的测试机制也很...
- **所有权与引用**:Rust的内存管理是基于所有权的概念,而C++主要依靠智能指针和手动管理。 - **抽象成本**:Rust的零成本抽象意味着其提供的高级特性不会带来额外的性能损失。 - **标准库**:Rust的标准库设计...
- **智能指针**:智能指针是 Rust 中一项重要的安全特性,用于管理动态分配的内存。 - **无惧并发**:Rust 设计之初就考虑了并发安全性问题,本部分将详细介绍 Rust 如何提供安全的并发支持。 - **面向对象编程在 ...
- 指针(引用、原生指针、智能指针) - 并发安全 - 函数、闭包、迭代器等语法特性 3. Rust属性的使用 4. Rust内存管理原理 5. Unicode在Rust中的应用 6. 字符串对象常用方法总结 是一份内容丰富、细节详尽的...
1. 内存安全:Rust通过其独特的所有权(Ownership)、借用(Borrowing)和生命周期(Lifetimes)系统来确保内存安全,避免内存泄漏和空悬指针等错误。 2. 并发:Rust的并发设计非常独特,支持无数据竞争(Data Race...
在Rust中,容器(或称为集合)主要分为两大类:基本类型和智能指针。 基本类型通常包括: - Vec<T>:动态数组,可在栈上存储一系列相同类型的数据。 - [T]:切片,是对Vec或数组的一部分的引用,不拥有数据。 - ...
- **智能指针**:盒子作为Rust中的智能指针之一,可以帮助自动管理内存。 #### 九、所有权转移语义 **所有权转移**: - **值移动**:当把一个值从一个位置移动到另一个位置时,原位置的值将不再有效。 - **所有权...
VSCode的强大之处在于其丰富的扩展生态系统,通过安装特定的插件,如“Rust (rls)”或“Rust Analyzer”,你可以获得代码智能感知、自动完成、错误检查和格式化等功能,极大提升了开发效率。 要使用VSCode运行Rust...