Cargo简明教程
Cargo是Rust的包管理器和构建工具。 Cargo 简明教程 1.基本使用 1.1 帮助 运行cargo help列出cargo的可用命令,基于cargo的不同版本,以下输出内容可能会有不同:
Cargo是Rust的包管理器和构建工具。 Cargo 简明教程 1.基本使用 1.1 帮助 运行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: rustup update stable Rust 1.58的主要新特性包括:
原子类型和原子操作 原子操作(atomic operation)是指不可分割且不可中断的一个或一系列操作,在并发编程中需要由CPU层面做出一些保证,让一系列操作成为原子操作。 一个原子操作从开始到结束可以是一个操作步骤,也可以包含多个操作步骤,这些步骤的顺序不可以被打乱,执行过程也不会被其他机制打断。
今天来学习rust中的闭包。 rust中的闭包实际上是一个匿名函数,这个匿名函数可以被赋值给一个变量,可以作为参数传递给函数,可以作为函数返回值被返回,也可以为它实现某个trait,使其表现出其他行为。 在rust中可以在一个地方创建闭包,然后在不同的上下文中执行闭包运算。不同于函数,闭包允许捕获调用者作用域中的变量。
昨天学习了Rust中与借用数据相关的三个trait: Borrow, BorrowMut和ToOwned。 理解了这三个trait之后,今天来学习Rust中能够实现写时克隆的智能指针Cow<'a B>。 1.Cow的定义 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类型。 为什么需要slice类型 为什么Rust会提供slice类型呢? Rust中的借用(Borrow语义)可以将一个值在其所有权不发生转移的情况下,借给其他变量使用,借用通过创建引用来实现,Rust中创建引用的行为被称为借用。 但对于常用的集合类型例如Vec<T>, String(String的底层是Vec<u8>),这些集合类型的引用类型&Vec<T>, &String,引用的将是整个集合的内容。
今天来学习rust中的ref关键字。 由一个例子引出ref关键字的使用 先看下面的例子。 例1: #[derive(Debug)] enum HttpMethod { Get(Get), Post(Post), } #[derive(Debug)] struct Get { url: String, } #[derive(Debug)] struct Post { url: String, body: Vec<u8>, } fn main() { let method = HttpMethod::Get(Get{ url: String::from("https://google.com"), }); match method { HttpMethod::Get(get) => println!("send get reuqest: {:?}", get), HttpMethod::Post(post) => println!("send post reuqest: {:?}", post), } println!("{:?}", method); // 编译错误: borrow of partially moved value: `method` } 上面例1中在使用match表达式进行模式匹配时,在执行第25行或26行时method会发生部分移动(partially moved),根据rust所有权规则中的Move语义,method将失去所有权,因此在第29行无法再使用method变量,报了编译错误。