- 博客(37)
- 收藏
- 关注
原创 Rust 登堂 之 Cell 和 RefCell(十二)
与 Cell 用于可 Copy 的值不同,RefCell 用于引用RefCell ,只是将借用规则从编译器推迟到程序运行期,并不能帮你绕过这个规则RefCell 适用于编译期误报或者一个引用被宰多处代码使用,修改以至于难于管理借用关系时使用 RefCell 时,违背借用规则会导致运行期的 panicCell 和 RefCell 都为我们带来了内部可变性这个重要特性,同时还将借用规则的检查从编译器推迟到运行期,但是这个检查并不能被绕过,该来早晚还是回来,RefCell 在运行期的报错会造成 panic。
2025-10-05 15:49:12
738
原创 Rust 登堂 之 Rc 与 Arc(十一)
Rc/Arc 是不可变引用,你无法修改它指向的值,只能进行读取,如果要修改,需要配合后面章节的内部可变性 RefCell 或互斥锁 Mutex一旦最后一个拥有者小时,则资源会自动被回收,这个生命周期是在编译期就确定下来的,Rc 只能用于同一线程内部,想要用于线程之间的对象共享,你需要使用ArcRc<T> 是一个智能指针,实现了Deref 特征,因此你无需先解开 Rc指针,在使用里边的 T ,而是可以直接使用 T ,例如上例中的 gadget1.owner.name。
2025-09-09 22:24:27
785
原创 Rust 登堂 之 Drop 释放资源(十一)
Drop 可以用于许多方面,来使得资源清理及收尾工作变得方便和安全,甚至可以用其创建我们自己的内存分配器!通过 Drop 特征和 Rust 所有权系统,你无需担心之后的代码清理,Rust 会自动考虑这些问题。我们也无需担心以外的清理掉仍在使用的值,这会造成编译器错误:所有权系统确保引用总是有效的,也会确保 drop 只会在值不再被使用时被调用一次。
2025-09-07 21:47:55
1194
原创 Rust 登堂 之 Deref 解引用(十)
现在,让我们一起来实现一个智能指针,功能上类似 Box<T> 由于 Box<T> 本身很简单,并没有包含类如长度,最大长度等信息,因此用一个元组结构体即可。(5, *y);运行后,报错如下(5, *y);很简单,当解引用 MyBox 智能指针时,返回元组结构体中的元素 &self.0, 有几点要注意的:在 Deref 特征中生命了关联类型 Target ,在之前章节中介绍过,关联类型主要是为了提升代码可读性。
2025-09-06 23:13:51
1189
4
原创 Rust 登堂 之 类型转换(九)
Box 背后是调用 jemalloc 来做内存管理,所以堆上的空间无需我们的手动管理,于此类似,带GC的语言中的对象也是借助于 Box 概念来实现的, 一切皆对象 = 一切皆 Box ,只不过我们无需自己去 Box 罢了。
2025-09-01 23:06:01
2409
原创 Rust 登堂 之 枚举和整数(八)
本文例举了常用(其实差不多也是全部了,还有一个 unstable 特性没有提到) 的从整数转换为枚举的方法,推荐度按照出现的先后顺序递减。但是推荐度最低,不代表它就没有出场的机会,只要使用边界清晰,一样可以大放棺材,例如最后的transmute 函数。
2025-08-31 22:04:17
355
原创 Rust 登堂 之 Sized和不定长类型 DST(七)
Rust中常见的 DST 类型有 str , [T],dyn Trait, 它们都无法单独被使用,必须要通过引用或者 Box来间接使用。我们之前已经见过,使用 Box 将一个没有固定大小的特征编程一个有固定大小的特征对象,那能否故伎重施,将 str 封装成一个固定大小类型?留个悬念先,我们来看看 Sized 特征。
2025-08-30 21:35:37
1133
原创 Rust 登堂 之 深入Rust 类型(六)
何为 newtype?简单来说,就是使用元组结构体的方式将已有的类型包裹起来 struct Meters(u32) ,那么此处 Meters 就是一个 newtype为何需要 newtype?Rust 这多如繁星的Old 类型满足不了我们吗?这是因为自定义类型可以让我们给出更具有意义和可读性的类型名,例如与其使用u32 作为距离的单位类型,我们可以使用 Meters ,它的可读性要好得多对于某些场景,只有 newtype 可以很好解决隐藏内部类型的细节一箩筐的理由 ~~~ 让我们先从第二点将其。
2025-08-29 21:37:24
959
原创 Rust 登堂 之 类型转换(三)
Rust 是类型安全的语言,因此在Rust 中做类型转换不是一件简单的事,这一章节,我们将对Rust 中的类型转换进行详尽讲解。高能预警,本章节有些难,可以考虑学了进阶后回头再看。
2025-08-28 22:35:36
1044
原创 Rust 登堂 之 迭代器Iterator(三)
如果你询问一个Rust资深开发,写Rust项目最需要掌握什么,?相信迭代器往往就是答案之一,无论你是编程新手亦或是高手,实际上大概率都用过迭代器,虽然自己可能并没有一是到这一点迭代器允许我们迭代一个连续的集合,例如数组,动态数组 Vec ,HashMap 等,此过程中,只需关心集合中的元素如何处理,而无需关心如何开始,如何结束,按照什么样的索引访问等问题。
2025-08-27 22:22:58
995
原创 Rust 登堂 之 函数式编程(三)
因此 action() 调用返回来intensity 的值 10let action = || ... 只是把闭包赋值给变量action,并不是把闭包执行后的结果赋值给 action, 因此这里action 就相当于闭包函数,可以跟函数一样进行调用 action()
2025-08-26 23:13:58
1255
原创 Rust 登堂 之 &‘static 和 T: ‘static(二)
Rust的难点之一,就在于它有不少容易混淆的概念,例如 &str ,str 与 String ,再比如本文标题那两位,不过与字符串也有不同, 这两位对于普通用户来说往往是无需进行区分的,但是当大家想要深入学习或使用Rust时,它们就会成为成功路上的拦路虎。与生命周期的其它章节不同,本文短小精悍,阅读过程可谓相当轻松愉快,话不多说,'static 在Rsut中是相当常见的,例如字符串字面值就具有'static 生命周期除此之外,特征对象的生命周期也是 'static ,例如。
2025-08-25 20:43:01
844
原创 Rust 登堂 生命周期(一)
学会Rust 基础后,大部分Rust代码对你来说都是家常便饭。对于一门难度传言在外地的语言,怎么可能如此简单就被征服,最难的生命周期还没看过长啥样。接下来我们一起来看下难点。
2025-08-24 22:57:47
1053
原创 Rust 入门 格式化输出 (二十四)
如果你的类型是定义在当前作用域中的,按么可以为其实现Display 特征,即可用于格式化输出age: u8,write!f ,"大佬再三,请受我一拜,姓名{},年芳{} ",fn main(){age: 18,println!("{}",p);只要实现 Display 特征中的 fmt 方法, 即可为自定义结构体 Person 添加自定义输出;
2025-08-23 22:34:14
1055
原创 Rust 入门 注释和文档之 cargo doc (二十三)
好的代码会说话,好的程序员不写注释,这些都是烂大街的“编程界俚语”,但是,如果你真的遇到一个不写注释的项目或程序员,。。。在之前的章节,我们学习来包和模块如何使用,在此章节将进一步学习如何书写文档注释,以及如何使用 cargo doc 生成项目的文档。最后将以一个包,模块和文档的综合例子,来将这些知识融合贯通。
2025-08-22 22:03:51
1068
原创 Rust 入门 模块 (二十二)
在本章节,我们将深入讲讲Rust的代码构成单元: 模块,使用模块可以将包中的代码按照功能性进行重组,最终实现更好的可读性及易用性,同时还能非常灵活地去控制代码的可见性,进一步强化Rust的安全性。
2025-08-21 22:26:16
1119
1
原创 Rust 入门 包 (二十一)
其实项目 Package 和包 Crate 很容易被搞混,甚至在很多书中, 这两者都是不分的,但是由于官方对此做了明确的区分,因此我们会在本章节中试图(挣扎着) 理清这个概念。
2025-08-20 21:20:16
2677
原创 Rust 入门 返回值和错误处理 (二十)
飞鸽传书,八百里加急, 自古以来,掌权者最需要的就是及时获得对某个事物的信息反馈,在吃过称中,也定义了相应的应急处理措施。社会演变至今,这种实现依然没变,甚至来到计算中的微观世界,也是如此,及时,准确的获知系统在发生什么,是程序设计的重中之重。因此能够准确的分辨函数返回值是正确的还是错误的,以及发生错误时该怎么快速处理。成了程序设计语言的必备功能。Go语言为人诟病的其中一点就是 if err!
2025-08-19 22:24:35
1201
原创 Rust 入门 生命周期-next2 (十九)
我不知道支撑我一口气写完的勇气是什么, 也许是不做完不算夫斯基,也许是一些读者对本书的期待,不管如何, 这章足足写了17000字,可惜不是写小说, 不然肯定可以获取很多月票;但是还没完,是的,就算是将近两万字,生命周期的旅程依然没有完结,在本书的进阶部分,我们将介绍一些关于生命周期的高级特性, 这些特性你在其它中文书中目前还看不到的。
2025-08-18 22:13:31
875
原创 Rust 入门 生命周期(十八)
之前的集合章节挺简单吧?是不是安逸了挺久了,要不咱们加点料?来试试Rust中令人闻风丧胆的生命周期?生命周期,简而言之就是引用的有效作用域。在大多数时候,我们无需手动的声明生命周期,因为编译器可以自动进行推导,用类型来类比下1. 就像编译器大部分时候可以自动推导类型<_> 一样,编译器大多数时候也可以自动推导生命周期2.在多种类型存在时,编译器往往要求我们手动标明类型<_> 当多个生命周期存在,且编译器无法推导出某个引用的生命周期时,就需要我们手动标明生命收起。
2025-08-17 22:46:37
869
原创 Rust 入门 KV存储HashMap (十七)
和动态数组一样, HashMap 也是Rust 标准库中提供的集合类型,但是又与动态数组不同, HashMap 中存储的是一一映射的KV键值,并提供来平均复杂度为o(1) 的查询方法, 当我们希望通过一个 key 去查询值是,该类型非常有用, 以致于Go 语言将该类型设置成了语言级别的内置特性。
2025-08-16 22:43:34
734
原创 Rust 入门 集合类型 (十六)
在Rust 标准库中有这样一批原住民, 他们天生贵族,集合在Rust中是一类比较特殊的类型,因为Rust中大多数数据类型都只能代表一个特定的值, 但是集合却可以代表一大堆值. 而且与语言级别的数组,字符串类型不同,标准库里的这些家伙是分配在堆上,因此都可以进行动态的增加和减少.第一个集合排着整齐的队列登场,它里面的每个元素都雄赳赳气昂昂跟在另外一个元素后面, 大小,宽度,高度竟然全部都已知, 真是令人惊叹. 它就是Vector 类型, 允许你创建一个动态数组,它里面的元素是一个紧挨着另一个排列的.
2025-08-15 18:00:10
601
原创 Rust 入门 泛型和特征-深入特征 (十五)
有时,我们会需要让某个特征A 能使用另一个特征B 的功能( 另一种形式的特征约束) ,这种情况下,不仅仅要为类型实现特征A ,还要为类型实现特征B 才行,这就是基特征( super trait) .例如有一个特征OutlinePrint , 它有一个方法, 能够对当前的实现类型进行格式化输出:println!println!println!println!println!
2025-08-15 13:47:22
2464
原创 Rust 入门 泛型和特征-特征对象 (十四)
为了解决上面的所有问题, Rust 引入了一个概念 -- 特征对象.只要实现了Draw 特征, 就可以调用draw 方法来进行渲染. 假设有一个Button和SelectBox 组件实现了Draw特征:// 绘制按钮的代码//绘制SelectBox的代码此时,还需要一个动态数组来存储这些UI对象:>,注意到上面代码中的?吗?
2025-08-15 09:32:24
1400
原创 Rust 入门 泛型和特征 (十三)
上面我们将Summary 定义成了 pub 公开的. 这样, 如果他人想要使用我们的Summary 特征, 则可以引入到他们的包中, 然后在进行实现.关于特征实现与定义的位置, 有一条非常重要的原则:如果你想要为类型A实现特征 T , 那么 A 或者 T 至少有一个是在当前作用域中定义的!
2025-08-14 16:44:47
920
原创 Rust 入门 泛型和特征 (十二)
泛型和特征是Rust 中最最重要的抽象类型, 也是你在学习Rust路上的拦路虎, 但是挑战往往与乐趣并存,一旦学会, 在后面学习Rust 的路上,你将以往无前.
2025-08-14 09:42:22
557
原创 Rust 入门 方法Method (十一)
Rust 使用 impl 来定义方法, 例如以下代码:x: f64 ,y: f64,//new 时 Cricle 的关联函数, 因为它的第一个参数不是self , 且 new 并不是关键字// 这种方法往往用于初始化当前结构体的实例Circle {x:x,y:y,// Circle 的方法, &self 表示借用省钱的 Circle 结构体我们这里先不详细展开讲解,只是先建立对方法定义的大致隐形. 下面的图片将Rust方法定义与其它语言的方法定义做了对比。
2025-08-13 13:39:23
1102
原创 Rust 入门 模式匹配 (十)
模式匹配,这个词,对于非函数语言编程来说,还真的蛮少听到,因为它经常出现在函数式编程里。用于为复杂的类型系统提供一个轻松的解构能力。曾记否?在枚举和流程控制那章,我们遗留来两个问题,都是关于match 的, 第一个是如何对Option 枚举进行进一步处理,另外一个是如何用match 来替代 else if 这种丑陋的多重分支使用方式。那么让我们先一起来揭开 match 的神秘面纱。
2025-08-13 12:40:10
756
原创 Rust 入门 流程控制 (九)
Rust程序是从上而下顺序执行的, 在此过程中,我们可以通过循环、分支等流程控制的方式,更好的实现相应的功能,
2025-08-11 20:56:00
1058
原创 Rust 入门 复合类型 【枚举,数组】 (八)
最后,让我们以一个综合性使用数组的例子, 来结束本章节学习fn main(){// 编辑器自动推导 出 one 的类型// 显式类型标注3];3] = [0;3];// arrays 是一个二维数组, 其中每一个元素都是一个数组, 元素类型是[u8;3]3];// 借用arrays 的元素用作循环中print!("{:?}: ",a);// 将a 变成一个迭代器, 用于循环// 你也可以直接用 for n in a {} 来进行循环print!
2025-08-10 22:53:31
613
原创 Rust 入门 复合类型 【元组,结构体】 (七)
在之前的User 结构体的定义中, 有一处细节: 我们使用了自身拥有的所有权的 String 类型,而不是基于引用的 &str 字符串切片类型, 这是一个有意为之的选择,: 因为我们想要这个结构体拥有它所有的数据, 而不是从其它地方借用数据。当然还有我们需要的表达式的求值结果。来完成一次模式匹配,因为元组是(n1,n2,n3)形式的,因此我们用一模一样的 (x,y,z) 形式来进行匹配,元组中对应的值会绑定到变量 x , y ,z 上, 这就是解构: 用同样的形式把一个复杂对象中的值匹配出来.
2025-08-09 21:20:32
772
原创 Rust 入门 复合类型 字符串+切片(六)
顾名思义, 字符串是由字符组成的连续集合. 但是在上一节中我们提到过, Rust 中的字符是 Unicode类型, 因此每个字符 占据4个字节内存空间, 但是在字符串中不一样, 字符串是UTF-8编码, 也就是字符串中的字符所占的字节数是变化的 (1-4), 这样有助于大幅降低字符串所占用的内存空间.
2025-08-09 19:33:34
1099
原创 Rust 入门,基础类型 -所有权引用与借用 (五)
总的来说.借用规则如下:1. 同一时刻,你只能拥有要么一个可变引用, 要么任意多个不可变引用2. 引用必须总是有效的.
2025-08-09 19:33:03
662
原创 Rust 入门,基础类型 -所有权和借用 (四)
之前提到过,本章会用String作为例子,因此这里会进行一下简单的介绍我们已经见过字符串字面值 let s="hello", s是被硬编码进程序里的字符串值 (类型为 &str) . 字符串字面值是很方便的, 但是它并不适用于所有场景1. 字符串字面值是不可变的, 因为被应变到程序代码中.2. 并非所有字符串的值都能在编写代码时得知。
2025-08-09 19:32:29
629
原创 Rust 入门,基础类型 -语句,表达式,函数 (三)
只有表达式能返回值,而;结尾的语句,在Rust中,一定要严格区分表达式和语句的区别.永不返回的发散函数!当用!作为函数返回类型的时候. 表示该函数永不返回 (diverging functions ) ,特别的,这种语法往往用做会导致程序崩溃的函数:panic!("已经穷途末路,崩溃吧!");
2025-08-09 19:31:56
803
原创 Rust 入门,基础类型 -字符,布尔,单元类型 (二)
引言: 这三个类型所除的地位比较尴尬, 你说他们重要把,确实出现的身影不是很多.说他们不重要把,有时侯也是不可或缺,而且这三个类型都有一个共同点:简单,因此同一放在一起讲.
2025-08-09 19:31:18
323
原创 Rust 入门,基础类型 -数值类型 (一)
之前提到过Rust的数值类型和运算跟其他语言较为相似,但实际上,除了语法上的不同之外,还是存在一些差异点:Rust拥有相当多的数值类型, 因此你需要熟悉这些类型所占用的字节数,这样就知道该类型允许的大小范围以及你选择的类型是否能表达负数类型转换必须是显式的,Rust永远也不会偷偷把你的16bit 整数转换成32bit整数Rust的数值上可以使用方法, 例如你可以用以下方法来将13.14 取整 13.14_f32.round(),在这里我们使用了类型后缀,因为编译器需要知道13.14的具体类型.
2025-08-09 19:30:44
857
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅