Cargo简明教程
📅 2024-12-27
Cargo是Rust的包管理器和构建工具。
1.基本使用 #
1.1 帮助 #
运行cargo help
列出cargo的可用命令,基于cargo的不同版本,以下输出内容可能会有不同:
Cargo是Rust的包管理器和构建工具。
运行cargo help
列出cargo的可用命令,基于cargo的不同版本,以下输出内容可能会有不同:
本文将通过实现一个简单的双向链表,理解Rust中的引用计数 (Rc)、引用单元 (RefCell) 和内部可变性 (Interior Mutability) 的概念。
双向链表是一种常见的数据结构,它允许我们在节点之间向前或向后遍历。为了实现双向链表,我们需要存储指向下一个和前一个节点的指针。然而,Rust的所有权系统会带来一些挑战。例如,因为简单使用引用(reference)可能会导致悬垂指针(dangling pointer)问题,这在Rust中是无法编译通过的。
...作为初学者,在掌握了rust的基本语法和所有权机制,尝试写一下常见数据结构和算法,目标是为了更好的理解rust的所有权机制。 受限于个人目前对rust仍处于入门阶段,因此本文代码实现不一定是最合适的,甚至可能存在问题。
今天的目标是用rust实现一个简单的单链表LinkedList
,同时为此链表提供从头部插入元素(头插法)、翻转链表、打印链表的功能。
最近,Rust 1.58版本发布了,因为Rust新版本发布比较频繁,稳定版本大约每六周就会发布一次,所以每个版本的新特性不会太多。
如果你在以前已经通过rustup安装了Rust,可以通过下面的命令将Rust升级到1.58:
1rustup update stable
Rust 1.58的主要新特性包括:
...原子操作(atomic operation)是指不可分割且不可中断的一个或一系列操作,在并发编程中需要由CPU层面做出一些保证,让一系列操作成为原子操作。 一个原子操作从开始到结束可以是一个操作步骤,也可以包含多个操作步骤,这些步骤的顺序不可以被打乱,执行过程也不会被其他机制打断。
...今天来学习rust中的闭包。
rust中的闭包实际上是一个匿名函数,这个匿名函数可以被赋值给一个变量,可以作为参数传递给函数,可以作为函数返回值被返回,也可以为它实现某个trait,使其表现出其他行为。 在rust中可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获调用者作用域中的变量。
...昨天学习了Rust中与借用数据相关的三个trait: Borrow
, BorrowMut
和ToOwned
。
理解了这三个trait之后,今天来学习Rust中能够实现写时克隆的智能指针Cow<'a B>
。
Cow是Rust提供的用于实现写时克隆(Clone on write)的智能指针。
...今天学习Rust中与借用数据相关的三个trait: Borrow
, BorrowMut
和ToOwned
。
这三个trait在Rust标准库module std::borrow
中。
std:borrow
是Rust标准库中用于处理借用数据的moudle。这个module中除了Borrow, BorrowMut, ToOwned三个trait
外,还有一个Cow
enum。不过今天我们先只学习这三个trait。
今天来学习Rust中的slice类型。
为什么Rust会提供slice类型呢?
Rust中的借用(Borrow语义)可以将一个值在其所有权不发生转移的情况下,借给其他变量使用,借用通过创建引用来实现,Rust中创建引用的行为被称为借用。
但对于常用的集合类型例如Vec<T>
, String
(String的底层是Vec<u8>
),这些集合类型的引用类型&Vec<T>
, &String
,引用的将是整个集合的内容。
今天来学习rust中的ref
关键字。
先看下面的例子。
例1:
1
2#[derive(Debug)]
3enum HttpMethod {
4 Get(Get),
5 Post(Post),
6}
7
8#[derive(Debug)]
9struct Get {
10 url: String,
11}
12
13#[derive(Debug)]
14struct Post {
15 url: String,
16 body: Vec<u8>,
17}
18
19 fn main() {
20 let method = HttpMethod::Get(Get{
21 url: String::from("https://google.com"),
22 });
23
24 match method {
25 HttpMethod::Get(get) => println!("send get reuqest: {:?}", get),
26 HttpMethod::Post(post) => println!("send post reuqest: {:?}", post),
27 }
28
29 println!("{:?}", method); // 编译错误: borrow of partially moved value: `method`
30
31 }
上面例1中在使用match表达式进行模式匹配时,在执行第25行或26行时method会发生部分移动(partially moved),根据rust所有权规则中的Move语义,method将失去所有权,因此在第29行无法再使用method变量,报了编译错误。
...