10 2023 档案

摘要:楔子 Rust 标准库的 collections 模块里面,实现了很多的数据结构,比如 HashMap、BtreeMap、HashSet,甚至还有链表、二叉堆等等,这些结构很多其它语言并没有提供,而是需要自己实现。但 Rust 不同,因为这些结构也比较常用,于是官方帮我们实现了,只不过放在了标准库当 阅读全文
posted @ 2023-10-26 19:02 古明地盆 阅读(935) 评论(0) 推荐(0)
摘要:智能指针 Box 在 Rust 里面,像整数、浮点数、数组等结构默认都是分配在栈上的,至于结构体和枚举,默认也在栈上分配。说到这里需要先解释一下容易陷入的误区,在介绍所有权的时候我们说过:如果值在栈上分配,不涉及到堆,那么在变量赋值的时候会拷贝一份。由于是拷贝,那么前后两个变量彼此独立,互不影响。 阅读全文
posted @ 2023-10-25 16:41 古明地盆 阅读(1557) 评论(0) 推荐(0)
摘要:楔子 本次我们来看看字符类型和字符串支持的一些方法。 字符所拥有的方法 Rust 的字符使用单引号,比如 'a',但需要说明的是,C 里面的 'a' 本质上就是一个 u8 整数,而 Rust 则不是。在 Rust 里面,'a' 代表的是单个 Unicode 字符,b'a' 才是 u8 整数。 fn 阅读全文
posted @ 2023-10-23 19:00 古明地盆 阅读(552) 评论(0) 推荐(1)
摘要:楔子 前面介绍了 Rust 的类型,比如整数、浮点数、数组等等,但我们仅仅是知道这些数据结构,而它们所拥有的方法我们还不是很清楚。在工作中光有数据结构也不够,如果不知道它提供的一系列方法,我们就无法对数据做处理。所以接下来的几篇文章,我们就来看这些数据结构都有哪些方法。 首先从整数和浮点数开始。 整 阅读全文
posted @ 2023-10-23 15:32 古明地盆 阅读(623) 评论(0) 推荐(0)
摘要:楔子 最近看到了两篇文章,觉得写得非常好。这里将其翻译一下,并结合自己的理解,对内容做一些补充。 文章链接如下: https://hashrust.com/blog/memory-safety-in-rust-part-2/ https://hashrust.com/blog/moves-copie 阅读全文
posted @ 2023-10-17 17:18 古明地盆 阅读(535) 评论(0) 推荐(0)
摘要:楔子 该篇文章是之前在介绍 CPython 解释器的时候所写,但实际上它也同样适用于 Rust。而这里之所以将这篇文章单独拿出来再说一遍,是因为后面要说的内容会大量地涉及栈和堆,所以先复习一下栈和堆相关的概念是很有必要的。 那么下面就以 C 语言的可执行文件为例,来探讨一下内存模型,以及变量的值究竟 阅读全文
posted @ 2023-10-17 16:18 古明地盆 阅读(1071) 评论(0) 推荐(0)
摘要:楔子 最后我们来复习一下 Rust 的模块与错误处理,等把这两部分说完之后,我们就可以继续学习后面的内容了。 先来看看模块。 模块 Rust 提供了一套强大的模块(module)系统,可以将代码按层次划分成多个逻辑单元(模块),并管理这些模块内部条目的可见性。所以模块就是条目的集合,而条目可以是:函 阅读全文
posted @ 2023-10-17 15:26 古明地盆 阅读(248) 评论(0) 推荐(0)
摘要:楔子 我们继续来梳理 Rust 语法,本次让我们把目光聚焦于函数、闭包、泛型和 trait 上面,开始接下来的内容。并且在梳理的时候,同样会对之前没有说的内容做一个补充。 函数 函数(function)使用 fn 关键字来声明,函数的参数需要标注类型,就和变量一样。如果函数返回一个值,返回值的类型必 阅读全文
posted @ 2023-10-17 14:05 古明地盆 阅读(381) 评论(0) 推荐(0)
摘要:楔子 关于 Rust 的基础知识我们已经介绍一部分了,下面来做一个总结。因为 Rust 是一门难度非常高的语言,在学习完每一个阶段之后,对学过的内容适当总结一下是很有必要的。 那么下面就开始吧,将以前说过的内容再总结一遍,并且在这个过程中还会补充一些之前遗漏的内容。 原生类型 首先是 Rust 的原 阅读全文
posted @ 2023-10-16 17:12 古明地盆 阅读(663) 评论(0) 推荐(0)
摘要:异常的演进 程序在运行的过程中,总是会不可避免地产生错误,而如何优雅地解决错误,也是语言的设计哲学之一。那么现有的主流语言是怎么处理错误的呢?比如调用一个函数,如果函数执行的时候出错了,那么该怎么处理呢。 C 语言 C 是一门古老的语言,通常会以指针作为参数,在函数内部进行解引用,修改指针指向的值。 阅读全文
posted @ 2023-10-16 13:31 古明地盆 阅读(377) 评论(0) 推荐(0)
摘要:楔子 本次来聊一聊 Rust 的模块导入,到目前为止,我们只有一个 main.rs 文件,可以看一下当前的工程目录: 我们的项目叫 RustProj,里面的 src 目录负责存放源代码。在当前命令行中输入 cargo run 并回车的时候,就会执行 src/main.rs 里的 main 函数。但随 阅读全文
posted @ 2023-10-14 23:00 古明地盆 阅读(738) 评论(0) 推荐(0)
摘要:楔子 Rust 的每个引用都有自己的生命周期,生命周期指的是引用保持有效的作用域。大多数情况下,引用是隐式的、可以被推断出来的,但当引用可能以不同的方式互相关联时,则需要手动标注生命周期。 fn main() { let r; { let x = 5; r = &x; } // 此处 r 不再有效 阅读全文
posted @ 2023-10-14 18:54 古明地盆 阅读(443) 评论(0) 推荐(0)
摘要:楔子 前面我们提到过 trait,那么 trait 是啥呢?先来看个例子: #[derive(Debug)] struct Point<T> { x: T, } impl<T> Point<T> { fn m(&self) { let val = self.x; } } fn main() { le 阅读全文
posted @ 2023-10-13 18:42 古明地盆 阅读(352) 评论(0) 推荐(0)
摘要:楔子 所有的编程语言都致力于将重复的任务简单化,并为此提供各种各样的工具。在 Rust 中,泛型(generics)就是这样一种工具,它是具体类型或其它属性的抽象替代。在编写代码时,我们可以直接描述泛型的行为,以及与其它泛型产生的联系,而无须知晓它在编译和运行代码时采用的具体类型。 总结一下泛型就是 阅读全文
posted @ 2023-10-13 13:21 古明地盆 阅读(753) 评论(0) 推荐(1)
摘要:楔子 本次来介绍一下 Rust 函数相关的内容,首先函数我们其实一直都在用,所以函数本身没什么可说的,我们的重点是与函数相关的闭包、高阶函数、发散函数。 闭包 Rust 的闭包由一个匿名函数加上外层的作用域组成,举个例子: fn main() { let closure = |n: u32| -> 阅读全文
posted @ 2023-10-13 11:51 古明地盆 阅读(419) 评论(0) 推荐(0)
摘要:楔子 Rust 标准库包含了一系列非常有用的被称为集合的数据结构,与内置的数组与元组不同,这些集合将自己持有的数据存储在了堆上,这意味着数据的大小不需要在编译时确定,并且可以随着程序的运行按需扩大或缩小数据占用的空间。 不同的集合类型有着不同的性能特性与开销,我们需要学会如何为特定的场景选择合适的集 阅读全文
posted @ 2023-10-12 17:38 古明地盆 阅读(310) 评论(0) 推荐(0)
摘要:楔子 枚举类型,通常也被简称为枚举,它允许我们列举所有可能的值来定义一个类型。我们知道 C 里面也有枚举,但 Rust 的枚举要远比 C 的枚举更加强大。 下面我们来学习一下 Rust 的枚举。 枚举值 让我们来尝试处理一个实际的编码问题,并接着讨论在这种情形下,为什么使用枚举要比结构体更加合适。假 阅读全文
posted @ 2023-10-12 16:44 古明地盆 阅读(696) 评论(0) 推荐(1)
摘要:楔子 上一篇文章我们介绍了 Rust 的结构体,而结构体是可以绑定方法的,那么什么是方法呢?先来回顾一下,介绍结构体时举的一个例子。 struct Rectangle { width: u32, height: u32, } fn get_area(rectangle: &Rectangle) -> 阅读全文
posted @ 2023-10-12 16:17 古明地盆 阅读(316) 评论(0) 推荐(0)