`

rust智能指针

    博客分类:
  • rust
 
阅读更多
Box,Rc,RefCell都是不可变借用,只不过RefCell是运行时检查,Box和RefCell是可变的,Rc不可变但同一个数据可以有多个拥有者

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`!
分享到:
评论

相关推荐

    rust-objc-id:用于Objective-C参考计数的Rust智能指针

    Rust智能指针,用于Objective-C参考计数。 为了确保在适当的时间保留和释放Objective-C对象,我们可以使用Id结构。 要实施别名规则,可以拥有或共享一个Id ; 如果它是拥有的,则意味着Id是对该对象的唯一引用,...

    shredder:垃圾收集了Rust的智能指针

    碎纸机 shredder是一个提供垃圾回收智能指针Gc 。 这在您希望共享访问某些数据但数据结构中具有不可预测的周期时非常有用。 (因此,Arc不适合。) shredder具有以下功能: 安全:即时检测错误情况,并保护您免受...

    Rust语言学习万字指南!.md

    - 指针(引用、原生指针、智能指针) - 并发安全 - 函数、闭包、迭代器等语法特性 3. Rust属性的使用 4. Rust内存管理原理 5. Unicode在Rust中的应用 6. 字符串对象常用方法总结 是一份内容丰富、细节详尽的...

    inviting-rust-note:Rust实战课程笔记

    语法面面观:函数与闭包(中)13 | 语法面面观:函数与闭包(下)14 | 语法面面观:模式匹配15 | 语法面面观:智能指针(上)16 | 语法面面观:智能指针(下)17 | 语法面面观:字符与字符串(上)18 | 语法面面观...

    Rust的语言功能之旅-Rust开发

    该项目旨在为有经验的程序员快速介绍Rust,作为阅读...第1章-基础知识第2章-基本控制流第3章-基本数据结构类型第4章-通用类型第5章-所有权和借用数据第6章-文本第7章-面向对象的编程第8章-智能指针第9章-项目组织和结构

    2023 短学期《Rust 开发实训》课程作业

    2023 短学期《Rust 开发实训》课程作业 作业 1:完成 myfind ...作业 3:完成 Rust 高级特性的相关 Exercise(智能指针、宏) 作业 4:完成一个简易多任务多线程的 Runtime 作业 5:完成一个简易的 Mini-Redis

    auto_impl:自动实现常见智能指针的特征

    一个proc-macro属性,用于自动实现引用的特征,一些常见的智能指针和闭包。 用法 该库需要Rust 1.30.0或更高版本。 将auto_impl添加到您的Cargo.toml ,然后在板条箱中使用它: // In Rust 2015 you still need `...

    smart:动态智能指针

    smart-动态调度的智能指针 该库使您可以从实现共享所有权的我们不同的指针之一动态构建智能指针。它具有线程安全( SyncPointer )和非线程安全( SharedPointer )构造。 当您需要一个API动态地成为多种不同的指针...

    射箭—从Rc / Arc指针类型抽象的库。-Rust开发

    射箭射箭是一个锈库,它提供了一种对Rc和Arc智能指针进行抽象的方法。 这样,您就可以创建数据结构,其中射箭是射箭库,它是一个锈库,提供了一种通过Rc和Arc智能指针进行抽象的方法。 这使您可以创建指针类型可参数...

    rust-smart-pointers

    防锈智能指针 这是rust最常用的一些智能指针的简单实现, @jonhoo从此流中获取。

    async_destruction:在Tokio中异步执行drop的智能指针

    在Tokio中异步执行的智能指针下降。 基本用法 依存关系 async_destruction = " 0.1 " tokio = { version = ' 1 ' , features = [ " full " ] } # Only used in the current example chrono = " 0.4 " 演示 use ...

    防锈设计模式-Rust开发

    隐私性可扩展性TODO稳定性,可扩展性TODO特性可将方法的可见性与数据的可见性分开(https://github.com/sfackler/rust-postgres/blob/master/src/lib.rs#L1400)集合是TODO的智能指针泄漏放大(“ Vec :: drain将Vec...

    tour_of_rust:Rust的语言功能之旅

    第8章-智能指针 第9章-项目组织与结构 内容目标: 第1-4章应该使您对Rust的美学有浓厚的兴趣 第1-6章应该给C语言的人一个好主意,他们的主意如何翻译 第1-8章应该给C ++的人一个好主意,他们的主意如何翻译 第9+章...

    nft_ptr:C ++`std

    C ++ std::unique_ptr智能指针替换,通过在以太坊区块链上将每个对象表示为NFT来确保唯一性。 什么有效 在程序启动时部署ERC721智能合约 当指针转移到nft_ptr时,调用智能合约以创建令牌 使用Ganache在本地链上进行...

    leetcoderust-ossoc2020-tjj-coder-daily:ossoc2020-tjj-coder-daily

    智能指针 并发 Day4 7/7 学习rust语法 学习《Rust程序设计语言》 trait对象 模式 高级特征 学习《Rust编程之道》 第三章:类型系统 Day5 7/8 1:学习rust语法 阅读《rust编程之道》 第四章:类型系统 第五章:内存...

    100天代码天:100天代码天

    C ++初学者-FreeCodeCamp C ++ 完毕02 排序算法C ++ 完毕03 数据结构C ++ 完毕04 设计模式(ES) --05 智能指针C ++简介C ++06 数字分隔符C ++ / C ++ 14 C ++07 STL C ++08 线程数C ++09 Lambdas C ++10 现代C ++...

    gui-engineering-101:Web为Web开发人员介绍GUI工程技能

    Web开发人员的GUI工程指南 写给前端的GUI工程基础入门 目录 写给前端的手动内存管理基础入门 ...半自动化:引用计数与智能指针 触类旁通:进入Rust时代 指数 去做 执照 版权所有(c)2020-2021 Wang Yifeng

    coca:与分配的内存相关的免分配数据结构

    'a, T&gt;相应的智能指针, Vec是一个有界的,可增长的数组,它不仅对元素类型通用,而且对基础存储类型( )和索引类型(受启发)通用, BinaryHeap是在Vec之上实现的优先级队列, Deque ,使用环形缓冲区实现的双端...

    basedrop:一套用于实时音频的内存管理工具

    basedrop提供类似于Box和Arc智能指针,它们将其内容标记为在另一个线程上进行延迟收集,而不是立即释放它们,从而使它们可以安全地放置在实时线程上。执照basedrop是根据和的条款发行的。 捐款按相同条款接受。

Global site tag (gtag.js) - Google Analytics