Rust编程
令狐壹冲
这个作者很懒,什么都没留下…
展开
-
substrate轻松学3:substrate构建一条链的体验
substrate搭建一条链原创 2022-07-04 14:24:30 · 2970 阅读 · 1 评论 -
substrate轻松学2:区块链与substrate
substrate轻松学2,区块链和substrate的关系原创 2022-06-28 15:53:26 · 3236 阅读 · 0 评论 -
004 Web Assembly康威游戏之优化
0 介绍视频地址:https://www.bilibili.com/video/BV1eg411g7c8相关源码:https://github.com/anonymousGiga/Rust-and-Web-Assembly1 说明在上一节的实现中,我们是在Rust中实现了填充的内容,然后让wasm bindgen转换为一个有效的js字符串,这样就产生了不必要的副本。因为js代码已经知道宇宙的宽度和高度,因此可以直接读取构成cell的web assembly内存。另外我们将切换到Canvas API,原创 2022-03-11 08:43:52 · 264 阅读 · 0 评论 -
003 Rust Assembly之实现康威生命游戏
0 介绍视频地址:https://www.bilibili.com/video/BV1eg411g7c8相关源码:https://github.com/anonymousGiga/Rust-and-Web-Assembly本节,我们就用WebAssembly实现一个简单的游戏。1 游戏规则在一个二维方格中,每个方格的状态都为“生”或者“死”。每个方格对应的就是一个细胞,每个细胞和它的周围的八个方格相邻。在每个时间推移过程中,都会发生以下转换:1、 任何少于两个活邻居的活细胞都会死亡。2、 任何原创 2022-03-08 08:28:46 · 387 阅读 · 0 评论 -
002 安装Rust和WebAssembly工具链和helloworld
0 介绍视频地址:https://www.bilibili.com/video/BV1eg411g7c8相关源码:https://github.com/anonymousGiga/Rust-and-Web-Assembly1 环境安装1、安装Rust工具链,可以参考https://www.rust-lang.org/tools/install为了很好的使用Rust和WebAssembly,我们需要Rust 1.3以上的稳定版。2、安装wasm-packcurl https://rustwasm原创 2022-03-07 09:52:31 · 581 阅读 · 0 评论 -
让代码丝滑般跳转,rust-analyzer,你值得拥有
1 RLS触怒了我我是一个专一的人,从学习Rust起就在vscode中使用rls作为跳转插件(主要原因其实是懒),如果不是今天它彻底触怒了我,恐怕我还会对它继续钟情下去。事情的原委是这样的,今天下载了某开源项目的代码,使用vscode打开其工程,点击rls安装的时候发现安装总是失败。本来这是一件小事,但是想起这些年来使用rls受的委屈,终于促使我决定将它换掉。听到大家都非常推荐rust-analyzer,于是我决定试试,不过真是不试不知道,一试吓一跳。2 使用rust-analyzer,构建丝滑般跳原创 2022-03-05 17:32:29 · 9230 阅读 · 3 评论 -
001 Rust和WebAssembly初体验
0 介绍视频地址:https://www.bilibili.com/video/BV1eg411g7c8相关源码:https://github.com/anonymousGiga/Rust-and-Web-Assembly1 为何是Rust和WebAssembly?低水平控制与高水平的人体工程学JavaScript Web应用程序很难获得和保持可靠的性能。Rust为程序员提供了低级别的控制和可靠的性能。较小的.wasm代码大小非常重要,因为 .wasm必须通过网络下载。Rust没有运原创 2022-02-23 18:59:12 · 379 阅读 · 0 评论 -
024 通过链表学Rust之非安全方式实现链表2
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节实现剩余的迭代器、Drop等。IntoIter实现代码如下://实现IntoIterpub struct IntoIter<T> (List<T>);impl<T> List<T> { pub fn into_iter(self原创 2022-02-14 08:41:33 · 148 阅读 · 0 评论 -
023 通过链表学Rust之非安全方式实现链表1
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list链表定义我们重新定义链表如下:pub struct List<T> { head: Link<T>, tail: *mut Node<T>,}type Link<T> = Option<Box<Node<T>>&原创 2022-02-07 08:23:40 · 448 阅读 · 0 评论 -
022 通过链表学Rust之为什么要非安全的单链表
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容前面我们都是使用安全的Rust编程来实现链表,但是实现的时候难度确实比较大。从本节开始,我们开始用非安全编程的方式来实现链表。栈和队列的区别是,栈是先进后出,队列是先进先出。对应到两者的push和pop函数,区别如下://栈input list:[Some(ptr)] -> (A原创 2022-02-03 10:02:10 · 2045 阅读 · 0 评论 -
021 通过链表学Rust之实现迭代器
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们来为我们的双链表实现迭代器。IntoIter实现代码如下://实现IntoIterpub struct IntoIter<T>(List<T>);impl<T> List<T> { pub fn into_iter(self原创 2022-02-02 11:25:53 · 275 阅读 · 0 评论 -
020 通过链表学Rust之push_back和pop_back等
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容之前我们实现了push_front、pop_front、peek_front,本节将实现push_back、pop_back、peek_back。这些函数的实现和之前的实现都差不多太多,只需要进行如下替换即可:tail <-> headnext <-> prev原创 2021-12-26 18:01:54 · 537 阅读 · 0 评论 -
019 通过链表学Rust之双链表实现Peek
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们实现双链表的Peek。实现peek根据我们在之前实现单链表的经验,我们很容易想到我们的peek函数怎么实现,如下: pub fn peek_front(&self) -> Option<&T> { self.head.as_ref().map原创 2021-10-31 14:57:48 · 300 阅读 · 0 评论 -
018 通过链表学Rust之实现pop front
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容pop front上一节,我们给双链表实现了new和push front方法,本节我们实现pop front,代码如下: pub fn pop_front(&mut self) -> Option<T> { self.head.take().map(|node原创 2021-10-31 14:56:21 · 316 阅读 · 0 评论 -
017 通过链表学Rust之实现元素添加
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容在上一节我们定义了我们的双链表,本节我们来给双链表创建new函数和pushfront函数。newimpl<T> Node<T> { fn new(elem: T) -> Rc<RefCell<Self>> { Rc::new(Re原创 2021-10-22 22:40:49 · 348 阅读 · 0 评论 -
016 通过链表学习Rust之安全的双链表布局
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节开始,我们将设计一个安全的双端队列。双端队列的布局我们主要使用到Rc和RefCell。RcRc: 通过Rc指针可以共享数据。Rust语言因为有所有权的概念,所以,数据失去了所有权之后,后面就无法使用该数据,而Rc就是解决此类问题的。而Rc指针指向的值是只读性质的,不能够修改。RefC原创 2021-10-10 10:15:16 · 239 阅读 · 0 评论 -
015 通过链表学习Rust之使用Arc
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容上节我们实现的链表是非线程安全的,因为Rc引用计数的修改不是原子的,如果要修改成线程安全的,我们需要使用Arc,同时类型必须实现Send和Sync两个trait。我们需要将Rc修改成Arc即可。...原创 2021-10-09 22:53:31 · 313 阅读 · 0 评论 -
014 通过链表学习Rust之持久化链表的Drop
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们实现可持久化链表的Drop。我们在之前实现可变链表的Drop的时候,我们是使用循环来进行回收的。这里我们如果采用统一的方法,是行不通的,因为我们此处通过Rc进行共享,必须等待引用计数为0 才能将数据从Rc中移除。Drop的实现Drop实现如下://实现Dropimpl<T原创 2021-10-07 09:26:37 · 211 阅读 · 0 评论 -
013 通过链表学习Rust之实现链表的通用函数
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们就在上一节定义的链表的基础上来实现链表的通用函数。因为本章的链表更多的操作链表的头尾和尾,所以我们在通用函数中不提供push和pop,而是提供append和tail函数。appendappend函数类似于之前我们实现的push,但是因为现在我们使用的Rc而不是Box,所以代码上略原创 2021-10-06 09:11:00 · 239 阅读 · 0 评论 -
012 通过链表学习Rust之持久化单链表
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容在之前我们已经实现了一个单链表,从这节开始,我们将实现一个持久化的单链表。通过持久化的单链表,可以让其他人来共享使用链表的数据。布局考虑如下例子:list1 = A -> B -> C -> Dlist2 = tail(list1) = B -> C ->原创 2021-10-05 09:16:41 · 165 阅读 · 0 评论 -
011 通过链表学习Rust之IterMut
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们为链表实现IterMut,既可以对元素进行可变引用的迭代器。iter_mut实现的代码如下://实现IterMutpub struct IterMut<'a, T> { next: Option<&'a mut Node<T>>,原创 2021-09-23 21:36:45 · 306 阅读 · 0 评论 -
010 通过链表学习Rust之Iter
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们为链表实现Iter,Iter主要是对元素的引用,因此本部分内容涉及到的Rust的知识点主要是生命周期。关于生命周期相关的知识点请看B站Rust进阶部分的讲解。Iter代码如下://实现Iterpub struct Iter<'a, T> { next: Opti原创 2021-09-22 19:59:55 · 335 阅读 · 0 评论 -
009 通过链表学习Rust之IntoIter
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们为链表实现迭代器。迭代器Trait的定义如下:pub trait Iterator { type Item; fn next(&mut self) -> Option<Self::Item>;}对于我们来说,我们要实现以下三个迭代器:原创 2021-09-18 21:49:27 · 397 阅读 · 0 评论 -
008 通过链表学习Rust之实现Peek函数
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容在之前的链表实现中,我们没有实现获取表头元素的peek方法,本节尝试去实现它。peek根据我们之前学习的知识,可以快速的写出代码如下: pub fn peek(&self) -> Option<&T> { self.head.map(|node| {原创 2021-09-16 21:01:55 · 230 阅读 · 0 评论 -
007 通过链表学Rust之支持泛型
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们让我们的链表支持泛型。首先修改我们的定义如下:pub struct List<T> { head: Link<T>,}type Link<T> = Option<Box<Node<T>>>;struc原创 2021-09-12 22:02:03 · 144 阅读 · 0 评论 -
006 通过链表学Rust之使用Option
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list微信公众号:令狐一冲详细内容在之前的章节中,我们实现了一个最小的可运行的单链表,然而这仅仅只是一个最小的可运行的链表。从本节开始,我们将创建一个更加完善的链表,这个链表能处理任何类型的元素,并且支持迭代器。使用Option在之前的章节中,我们定义Link如下:enum Link { E原创 2021-09-09 21:09:49 · 344 阅读 · 0 评论 -
005 通过链表学Rust之实现Drop
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容本节我们为链表实现Drop函数。按照我们常规的方式,我们可能的实现方式如下:impl Drop for List { fn drop(&mut self) { // NOTE: you can't actually explicitly call `drop`原创 2021-09-07 13:01:37 · 224 阅读 · 0 评论 -
004 通过链表学Rust之测试
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容上一节我们已经完成了链表的基本功能。本节就对上一节的例子进行测试。步骤如下:cargo new mylist --lib在mylist/src/lib.rs中写入如下代码:use std::mem;#[derive(Debug)]pub struct List{ hea原创 2021-09-05 09:56:33 · 144 阅读 · 0 评论 -
003 通过链表学Rust之给链表添加函数
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-list详细内容在上一节,我们基本确定了链表的布局方式,下面我们就来实现链表的响应的函数。对于链表来说,最基本的几个函数就是:New //new函数为创建链表的函数Push//添加元素的函数Pop //弹出元素的函数New实现如下:impl List { pub fn new() ->原创 2021-09-04 11:42:52 · 192 阅读 · 0 评论 -
002 通过链表学习Rust笔记之链表布局
介绍视频地址:https://www.bilibili.com/video/av78062009/相关源码:https://github.com/anonymousGiga/Rust-link-listRust中最常见的链表用函数式的语法定义一个链表如下:List a = Empty | Elem a (List a)一个链表要么是空的类型,要么是一个值后面跟着一个链表,这种被称为递归定义类型,表示为和类型。Rust中的enum就是类型系统的和类型。所以最常见的Rust的链表的定义如下:#原创 2021-09-03 15:16:42 · 374 阅读 · 0 评论 -
001 通过链表学习Rust笔记之前言
从本节开始,我们来学习《通过多种链表学习Rust》这本书,英文版地址为:https://rust-unofficial.github.io/too-many-lists/在Rust中,实现一些数据结构一直是一个比较难的问题,因此作者写了本书。在本书中,一共会实现6个链表。在实现6个链表的过程中,会使用到引用&、可变引用&mut,Box、Rc、Arc、*const、*mut、所有权、内部易变性、复制、非安全编程等Rust知识点。英文原版书主要是通过链表来学习Rust,会在将链表的过程中,介原创 2021-09-02 08:31:12 · 234 阅读 · 0 评论 -
036 Rust死灵书之Vec的完整代码测试
介绍本系列录制的视频主要放在B站上Rust死灵书学习视频Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source详细内容本节主要对之前实现的MyVec进行测试,代码如下:#![feature(ptr_internals)]use std::mem;use std::alloc::{alloc, realloc, dealloc, Layout, handle_alloc_error};use std::ptr::原创 2021-09-02 08:29:44 · 540 阅读 · 0 评论 -
035 Rust死灵书之Vec处理零尺寸类型
介绍本系列录制的视频主要放在B站上Rust死灵书学习视频Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source详细内容在我们之前的MyVec的实现中,一直没有考虑零尺寸类型,本节我们来完善。在处理零尺寸类型时,我们需要注意以下几点:当分配器API传递分配尺寸为0时,会导致未定义行为;对零尺寸类型的裸指针做offset是一个no-op,这会破坏我们的C-style指针迭代器。支持零尺寸类型的代码如下:#![原创 2021-09-01 11:45:12 · 679 阅读 · 0 评论 -
034 Rust死灵书之为Vec实现Drain
介绍本系列录制的视频主要放在B站上Rust死灵书学习视频Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source详细内容drain 是一个集合 API,它将容器内的数据所有权移出,却不占有容器本身。我们可以声明一个 Vec 所有内容的所有权,然后复用分配给它的空间。它产生一个迭代器(Drain),以返回 Vec 的所有值。代码如下:#![feature(ptr_internals)]use std::mem;us原创 2021-08-31 12:34:08 · 431 阅读 · 0 评论 -
033 Rust死灵书之重构Vec
介绍本系列录制的视频主要放在B站上Rust死灵书学习视频Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source详细内容在本节中,抽取出来一个RawVec对之前的代码进行重构,如下(重建一个工程):#![feature(ptr_internals)]use std::mem;use std::alloc::{alloc, realloc, dealloc, Layout, handle_alloc_error};原创 2021-08-31 12:31:29 · 299 阅读 · 0 评论 -
032 Rust死灵书之Vec的IntoIter
介绍本系列录制的视频主要放在B站上Rust死灵书学习视频Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source详细内容IntoIter 以值而不是引用的形式访问 Vec,同时也是以值的形式返回元素。为了实现这一点,IntoIter 需要获取 Vec 的分配空间的所有权。IntoIter 也需要 DoubleEnd,即从两个方向读数据。相关代码如下:#![feature(ptr_internals)]use st原创 2021-08-30 10:36:10 · 379 阅读 · 0 评论 -
031 Rust死灵书之Vec实现insert和remove
介绍本系列录制的视频主要放在B站上Rust死灵书学习视频Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source详细内容下面为MyVec实现insert和remove函数:#![feature(ptr_internals)]use std::mem;use std::alloc::{alloc, realloc, dealloc, Layout, handle_alloc_error};use std::ptr:原创 2021-08-30 10:33:32 · 415 阅读 · 0 评论 -
030 Rust死灵书之让Vec支持slice
介绍本系列录制的视频主要放在B站上Rust死灵书学习视频Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source详细内容支持slice功能,我们实际上可以看成是对数据进行引用,因此我们只要实现Deref<Target=[T]>即可。#![feature(ptr_internals)]use std::mem;use std::alloc::{alloc, realloc, dealloc, Layout原创 2021-08-29 11:16:00 · 376 阅读 · 0 评论 -
029 Rust死灵书之Vec实现Drop
介绍本系列录制的视频主要放在B站上Rust死灵书学习视频Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source详细内容实现Drop最简单的就是循环调用pop方法,不过需要注意的是,当T不需要drop时,不是一定要调用drop。下面我们来实现drop:#![feature(ptr_internals)]use std::mem;use std::alloc::{alloc, realloc, dealloc, L原创 2021-08-29 11:13:54 · 177 阅读 · 0 评论 -
028 Rust死灵书之Vec的push和pop
介绍本系列录制的视频主要放在B站上Rust死灵书学习视频Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-SourceVec的push和pop本节给MyVec实现push和pop方法,完整代码如下:#![feature(ptr_internals)]use std::mem;use std::alloc::{alloc, realloc, Layout, handle_alloc_error};use std::ptr原创 2021-08-26 08:30:06 · 781 阅读 · 0 评论