Rust语言学习
欢迎来到《Rust语言学习》专栏!这里,我们将详细介绍Rust语言的语法、特性和应用,从基础概念到高级技巧,涵盖了编程语言的核心要素。通过逐步深入的解析和实践操作,您将了解Rust语言的运行机制、内存管理和错误处理等方面的知识。无论您是初学者还是有一定经验的开发者,都能在这个专栏中找到启发和收获。让
Codevalley
这个作者很懒,什么都没留下…
展开
-
Cargo包管理器的简单介绍
Rust 语言中的 Cargo 是其包管理器,它用于管理 Rust 项目中的依赖关系、构建和发布等任务。Cargo作为Rust的官方的包管理器,为Rust的项目构建、流行起到了不可替代的作用,也为Rust编程、工程管理提供了极大的帮助和便利性。在安装 Rust 的同时,Cargo 会被自动安装。原创 2023-08-24 14:28:07 · 260 阅读 · 0 评论 -
Rust的第一个程序:“Hello World”
所有编程语言的学习,第一个程序都是"Hello World",我们也从"Hello World"开始。原创 2023-08-24 14:17:24 · 119 阅读 · 0 评论 -
Rust的安装
Rust 是一种编程语言,它的设计目标是提供安全、并发、高效的编程体验。要开始使用 Rust,您需要在您的计算机上安装它。以下是在 Windows、Linux 和 macOS 上安装 Rust 的步骤。以上就是在 Windows、Linux 和 macOS 上安装 Rust 的步骤。希望这可以帮助您开始使用这种编程语言。下载并安装 Homebrew。这是一个包管理器,它将帮助您安装 Rust。现在,您可以开始编写 Rust 程序了。现在,您可以开始编写 Rust 程序了。输入您的密码,然后继续安装。原创 2023-08-24 14:04:17 · 294 阅读 · 0 评论 -
初识Rust语言
生命周期参数化的类型(Lifetime Parameterized type):Rust允许将生命周期作为泛型参数,以此来保证引用的有效性。生命周期参数化的类型是Rust中的高级特性,用于处理复杂的数据结构和算法。Trait:Trait是Rust中的一种抽象类型,类似于其他语言中的接口。生命周期(Lifetime):Rust要求在编译时验证所有借用的合法性,因此需要标识出每个变量的生命周期。模式匹配(Pattern Matching):模式匹配是Rust中的重要特性,它允许匹配值的模式并执行相应操作。原创 2023-08-23 10:42:36 · 132 阅读 · 1 评论 -
Rust学习笔记(16)——单向链表之四:链表的遍历和反转
前几篇学习了插入和删除等操作,再尝试实现一下遍历和翻转。一、遍历遍历的实现比较简单,从头节点开始逐个后移即可。下面是一个比较简单的实现,只是依次打印出节点的值。impl BoxedLinkedList { fn traverse(&self) { let mut curr = self.head.as_ref(); while curr.is_some() { print!("{:?}\t", curr.unwrap().原创 2021-04-08 19:36:15 · 1029 阅读 · 0 评论 -
Rust学习笔记(15)——struct、Option和Box组合应用实现单向链表之三
本次学习实现链表中间的插入和删除。插入按照从小到大的顺序插入,删除则为找到要删除的值,删除节点。一、插入首先我们假设链表是有序的。插入的值为value,插入操作也是从头开始向后遍历链表,找到符合以下条件的节点curr:curr.val < value; curr.next.val >= value;要考虑几种特殊情况:链表为空; 插入的值小于头结点的值; 插入的值大于尾节点的值;实现代码如下:impl BoxedLinkedList { fn inser.原创 2021-04-08 18:00:18 · 339 阅读 · 0 评论 -
Rust学习笔记(14)——struct、Option和Box组合应用实现单向链表之二
在上一篇学习了链表的头部插入和删除,今天尝试一下尾部的插入和删除。一、尾部插入在链表的尾部插入,分几种情况:链表为空:直接将头指针指向新节点;否则进入第二步: 从头结点开始向后一直找到尾节点,将新节点挂到尾节点上。实现时的与C的区别在于向后的遍历找到尾部节点,因为所有权的限制,不能像C语言那样写:curr = curr->next;完整代码如下:impl BoxedLinkedList { fn push_back(&mut self, value: i原创 2021-04-08 14:46:59 · 458 阅读 · 0 评论 -
Rust学习笔记(13)——struct、Option和Box组合应用实现单向链表
前面深入学习了struct、Option和Box的所有权约束及各种场景的使用,现在用struct、Option和Box组合来实现一个单向链表,并实现链表常见的头部插入、删除,尾部插入、删除,中间插入、删除,链表反转,遍历等操作。一、链表和节点定义为了方便演示,我们先定义节点,以及节点的new 和link操作,然后再定义一个链表结构体,其中仅有一个头指针成员。1.1 先定义节点及节点的new / link 操作#[derive(Debug)]struct Node { val: i原创 2021-04-07 18:39:04 · 1146 阅读 · 0 评论 -
Rust学习笔记(12)——Box智能指针
在rust编程语言的官方介绍中,对于Box智能指针介绍比较简单,只说其可以包裹一个变量,将变量存在堆上,Box中包含堆上的地址。同时Box指针实现了自动解引用trait。在实际操作中,也确实类似,对其操作与对普通类型操作类似,支持连续引用和解引用,在编译器不能自动解引用时,需要手动解引用。Box指针看似简单,实际上在复杂的应用场景中也有很多情况,我们从简单变量的指针开始。一、简单变量的指针操作对于简单变量,操作可以如下:(例子-1)fn main() { let m...原创 2021-04-07 12:55:19 · 1952 阅读 · 0 评论 -
Rust学习笔记(11)——Option和struct组合带来的所有权问题及总结
在上一篇的基础上,我们加一层Option的包裹。还是先定义struct:#[derive(Debug)]struct Point { x: Box<i32>, y: i32,}下列代码不可编译:fn main() { let a = Some(Point { x: Box::new(5), y: 5, }); let b = a.as_ref(); let c = b.unwrap();原创 2021-04-06 23:21:44 · 928 阅读 · 0 评论 -
Rust学习笔记(10)——引用和解引用的所有权问题
先定义一个struct如下:#[derive(Debug)]struct Point { x: i32, y: i32,}但我们从最简单的类型开始。我们知道对于简单类型来说,其值是可以copy的,所以下方代码没有任何问题:fn main() { let a = 5; let b = &a; let mut c = *b; // copy '*b' to c; So c's value is 5. c += 10; pri原创 2021-04-06 22:25:38 · 2655 阅读 · 0 评论 -
Rust学习笔记(9)——Option的几个方法及所有权问题
在rust的设计中,Option的设计非常巧妙,避免了其它语言中常见的Null引起的各种错误和异常。但Option与所有权的结合,尤其是在一些特定的数据结构,如链表、图等设计中,加上引用的各种约束,就使得Option的使用变得复杂起来。1、unwrap方法在确认Option不为None的情况下,可以用unwrap方法拆解出其中的值,并获取值的所有权。这里要强调的是,unwrap会消费Option本身的值,后面就不能再用了。 let a = Some(Box::new(5)); l原创 2021-04-06 16:43:20 · 7627 阅读 · 7 评论 -
Rust学习笔记(8)——连续引用的约束和限制
为了彻底弄明白所有权和引用的约束,再试试连续引用的一些特殊情况。结构体:#[derive(Debug)]struct Point { x: Box<i32>, y: Box<i32>, z: i32,}1、先看第一种一般情况,连续不可变引用,可以编译运行:fn main() { let a = Point { x: Box::new(3), y: Box::new(4), z: 5,原创 2021-04-02 10:47:46 · 468 阅读 · 0 评论 -
Rust学习笔记(7)——引用情况下Vec和数组中所有权的问题
关于Vec和数组中变量的所有权,以及被引用情况下的所有权,下面的代码基本涵盖了主要的场景,可编译通过,不做解释了:fn main() { let mut a = vec![Box::new(1), Box::new(2)]; let mut b = &mut a; // a[0] = Box::new(10); b[0] = Box::new(10); let c = &mut b; c[0] = Box::new(20);原创 2021-04-01 23:35:45 · 1073 阅读 · 0 评论 -
Rust学习笔记(6)——引用情况struct中所有权的转移问题
还是先定义struct:#[derive(Debug)]struct Point { x: Box<i32>, y: Box<i32>, z: i32,}通过可变引用,可以改变成员的值,与结构体成员为简单的i32类型一致,除了不能对Box类型使用 “+=”符号以外。fn main() { let mut a = Point { x: Box::new(3), y: Box::new(4),原创 2021-04-01 22:58:29 · 1967 阅读 · 0 评论 -
Rust学习笔记(5)——Vec成员的所有权
上篇文章探讨了struct的成员的所有权转移,struct允许部分成员转移所有权。那么另一个常用的类型Vec呢?是不允许的。下面代码无法编译:fn main() { let a = vec![Box::new(3), Box::new(4)]; let b = a[0];}提示如下错误:cannot move out of index of `std::vec::Vec<std::boxed::Box<i32>>`move occurs beca原创 2021-04-01 15:12:19 · 901 阅读 · 2 评论 -
Rust学习笔记(4)——struct中所有权的转移
先定义一个struct:#[derive(Debug)]struct Point { x: Box<i32>, y: Box<i32>, z: i32,}在前面的学习中提到,struct拥有数据的所有权,并且对于实现了copy的类型,可以直接copy出去,以下代码,是可以正常编译的:fn main() { let a = Point { x: Box::new(3), y: Box::new(4),原创 2021-04-01 14:42:56 · 2390 阅读 · 0 评论 -
Rust学习笔记(3)——struct/vec的所有权
在struct和vec复合型数据类型中,struct和vec 默认是拥有变量的所有权的。如下代码:fn main() { let a = Box::new(1); let b = Box::new(2); let c = Point { x: a, y: b }; // let d = vec![a, b]; println!("{:?}", b); println!("{:?}", a); // println!("{:?}", d);}原创 2021-04-01 11:12:36 · 1113 阅读 · 0 评论 -
Rust指针学习笔记(2)——struct和Vec
一、对结构体本身的引用先定义一个简单的结构体:#[derive(Debug)]struct Point { x: i32, y: i32,}在上一篇学习中,有一个关键点,就是如果一个变量被借用以后,那么在借用结束前,该变量的值都不可改变(即使其为mut类型),这样的好处就是避免了数据竞争。同样,这点对于复合类型,如struct,也是一样。下面代码不可编译:fn main() { let mut a = Point { x: 5, y: 5 }; let原创 2021-03-31 23:25:07 · 1504 阅读 · 2 评论 -
用Rust智能指针实现单向链表的插入删除
最近在熟悉Rust,都说链表是Rust的第一个坑,今天尝试用智能指针实现一个单向链表的常见操作:头部插入、删除,尾部插入、删除,中间插入、删除,链表反转。首先定义链表节点:#[derive(Debug)]struct Node { value: i32, next: Option<Box<Node>>,}节点方法:impl Node { fn new(value: i32) -> Box<Node> {原创 2021-03-29 16:22:07 · 740 阅读 · 1 评论 -
Rust指针学习笔记(1)——简单类型
开始学习Rust的指针,在Rust中也叫借用(引用),下文是一个意思。从最简单的类型开始。所有权概念什么的,就不再这里赘述了。本系列仅为自学笔记系列,错误之处难免,若引起误会请谅解。一、不可变引用Rust中对于简单类型,如int家族,默认是进行值拷贝的,所以一般不会探讨这类指针,实际给我们带来困惑的也不是这类指针。但为了深入理解其机制,我们还是从最简单的类型开始。fn main() { let a = 5; let b = &a; println!("{:?}原创 2021-03-30 19:09:51 · 922 阅读 · 0 评论