青蛙小白

用rust实现简单的双向链表

本文将通过实现一个简单的双向链表,理解Rust中的引用计数 (Rc)、引用单元 (RefCell) 和内部可变性 (Interior Mutability) 的概念。 双向链表是一种常见的数据结构,它允许我们在节点之间向前或向后遍历。为了实现双向链表,我们需要存储指向下一个和前一个节点的指针。然而,Rust的所有权系统会带来一些挑战。例如,因为简单使用引用(reference)可能会导致悬垂指针(dangling pointer)问题,这在Rust中是无法编译通过的。

用rust实现简单的单链表

作为初学者,在掌握了rust的基本语法和所有权机制,尝试写一下常见数据结构和算法,目标是为了更好的理解rust的所有权机制。 受限于个人目前对rust仍处于入门阶段,因此本文代码实现不一定是最合适的,甚至可能存在问题。 今天的目标是用rust实现一个简单的单链表LinkedList,同时为此链表提供从头部插入元素(头插法)、翻转链表、打印链表的功能。

rust语言基础学习: rust中的slice类型

今天来学习Rust中的slice类型。 为什么需要slice类型 为什么Rust会提供slice类型呢? Rust中的借用(Borrow语义)可以将一个值在其所有权不发生转移的情况下,借给其他变量使用,借用通过创建引用来实现,Rust中创建引用的行为被称为借用。 但对于常用的集合类型例如Vec<T>, String(String的底层是Vec<u8>),这些集合类型的引用类型&Vec<T>, &String,引用的将是整个集合的内容。

rust语言基础学习: 使用ref关键字在模式匹配中通过引用进行绑定

今天来学习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变量,报了编译错误。