[Day11] 智慧指标

老实说我还真的想不到要写啥了,有关基础语法,真的很难想欸QQ
拜托来个人给我点想法吧 QQQQQQQQ
然後我在想是不是字数不超过 2000 那天就在水 希望大家看到都能够理解我说的内容
喔对 大家都不爱复习 QQ Leetcode 那篇有教一些小地方 我前面忘记讲的可以去看看。


今天就来讲一下智慧指标吧,後面 unsafe 应该会讲到原生指标,如果我记得的话。
然後我先讲,我没有学过 C++ 的智慧指标,所以不会提及有关 C++ 纯粹个人理解。
那就开始ㄅ owob
先对比一下 原生指标 跟 智慧指标 吧

  • 初始指标会将变数指向记忆体位址
  • 智慧指标除了能将变数指向记忆体位置外还能提供其他资讯,像是之前讲过的很多结构体都是智慧型指标owo

在 Rust 中最简单的智慧指标是 Box 所以我之前好像讲某个东西的时候重复命名了 QQ 没注意到sor
建立方式如下

let owo = Box::new(87);

那 Box 简单讲主要是将数值分配到 heap 上而不是 stack。
Box 的功能其实偏少,也代表了他占用的效能其实不多。跟一般的指标差别只在分配位置。
使用的场合主要分成三类:

  • 型别无法在编译期间知道大小但是又想在知道使用在需要知道大小的地方
  • 需要转移庞大资料且须确保不会被 copy 时
  • 当需要一个值但是需要的是实作特徵而非是特定型别

老实说,这边到底谁看得懂 QQ
所以下面就来举例吧
递回型别
这个应该显而易见,无法知道确切大小的型别。
就直接拿官方的"直白的"例子吧!
Cons List
这个的概念会是建立一个容器并且将元素 x 作为此容器开头并以元素 y 作为此容器结尾
上面所说 x 跟 y 是传入值ㄛ 他都会包含两个元素

  • 目前项目
  • 下一个项目

那如果说到底了,就会包含一个 Nil
好了 所以我们就定义一个 enum 实现上面所说的东西吧!
如果昨天的有认真看应该知道怎麽用吧 不然就我写太烂 呜呜

enum List {
    Cons(i32, List),
    Nil,
}

可以发现 List 那这样就会递回下去ㄌ
引用之後编译会发现一堆报错

要怎麽解决呢 靠上面的 Box 阿
这样的话他就不会认定为是一个递回形式了,也就是以 Box 取代了原本的形式

enum List {
    Cons(i32, Box<List>),
    Nil,
}

那这样使用的时候就不会出错了 owob
蛤 不知道怎麽传入ㄇ 那我附给你好了

let Cons_List = Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil))))));

那当他的数值离开作用域之後也会自动回收,这就是智慧指标
这边最後在讲个

fn k() {
    let a = Box::new(5);
    //let b = a; 会报错
    let b = *a; // 这样才能传输所有权
}

这边在介绍一个 Rc 的智慧指标
Rc 可以将多个所有权共用多个变数
每当多了一个计数就会加一。

use std::rc::Rc;

fn main() {
    let a = Rc::new(50);
    let b = a.clone();
    let c = a.clone();
    println!("{}", Rc::strong_count(&a));
}

这个会输出 3
但是需要注意的是,这个只能在单一 thread 中运用,多线程可能之後会说明吧(?

let owo = Rc::downgrade(&a);
println!("{}", Rc::strong_count(&a));

那加上这两行会输出甚麽, Ans: 3
一样是 3 为啥,因为他是强参考的计数而不是弱参考的计数,owo 是属弱参考
弱参考是 Rc 的另一个版本 Weak
他所共用的指标并没有所有权,但是还是保留着前面 Rc 的参考。


今天大概就这样,我得说 智慧指标 这东西我真的没用过,所以这次翻书的时间长了很多。
可能有蛮多地方讲得不好的,深感抱歉。
可是这个形式真的还不错,边写文章边学习。
这边有问题的可能我没办法回答 QQ 能力不够
然後真的开始觉得累 呜呜
引用我朋友的一句话

本次参考资源:

  • Rust Book
  • 我 Rust 我骄傲

<<:  Day 1 : 前言+本系列会使用到的东西(vscode、xampp、virtualbox、ubuntu、python安装说明)

>>:  Day 1 序言及基本运算元件

【day18】聊天室(上) X Realtime database

好的,今天我们要来看的就是我们的精华啦-聊天室。 原本我们在设计邀约流程的时候是。 (原本设想的流程...

Day01-系列文介绍、规划

前言 Hello 大家好我是 Larry,去年休息一次後今年决定再度参战,这也是我第三次参加铁人赛了...

【领域展开 14 式】 Favicon 的好助手!Canva 使用与 5 下搞定网站设定

今天需要疗癒的视觉效果,Menu 再等等.. 跳脱进度,想先做网站 Favicon 的设计 (其实是...

Day17 - [丰收款] 永丰API虚拟帐户付款与PayToken查询与更新状态

在经过了多日有一天没一天的研究、写Code与写作,今天假日花了一点时间将原本从Jupyter Not...

效率在哪里?别再开会开到死

在一开始整理观察到常见的痛点们,你看到的是想解决的地方,也可以换个角度去思考,其实你想要保持是你的信...