Li Guangqiao
一个正在转rust的ExtJs前端工程师。迷信rust的整体发展,十分相信rust在各个领域都能发光发热,至少目前rust在很多领域上验证了其安全性、易维护性。但说实话对于我这种菜鸡也是真的难上手哈哈哈~~。 思路总结:
- 万物诞生都会有一个需求来源,每一个改变都是为了解决某个问题,最后应该考虑如何去做
- 学会掌握一些宏观的知识和理论:系统论、还原论
- 工程化思想,如何描述整体,从整体架构到模块关联等 故学习东西应该像看地图一样,先看整体了解整体的结构,然后再聚焦每一个模块,对于模块的学习,思考三个问题,“是什么?”、“为什么?”、“怎么做?”;那么设计一个东西时也应该去考虑整体性和关联性。
有关于未来的发展,以下是鄙人的粗浅的观点:
- 编程语言未来应该是每个人必备的工具
- 未来的交互方式应该会以语言交互为主流
- 下一个去中心化的技术方案出来之前,区块链依然是web3建立价值体系的基础技术方案,如何将现实价值和虚拟价值联通是进入数字世界的一个大难题。
- 未来注定是AI的世界。AI的进化会伴随绝大部分人的退化,届时除了尖端人才,人们学习的重心会放在何处?
rust实现栈数据结构
Li Guangqiao - 06/08/2023
Rust实现栈数据结构 数据结构(stack)的概念 栈就是一种线性数据结构,可用于函数调用、网页数据记录等。 栈的特性:元素先进后出,后进先出 需求来源: 了解栈数据结构和结构特性。 目标: 语言:Rust 实现一个数据存储结构栈:Stack 栈具有存储数据先进后出、后进先出的特性。 功能需求: 开辟一个栈结构的存储空间 存储数据的基本操作: 数据查询 数据添加 数据删除 数据插入 方便性工具方法 空栈判断方法 栈长度方法 快速返回第一个入栈数据 快速返回最后一个出栈数据 总体功能结构图 基础能力 数据查询功能 查询栈中的所有元素及其数据存储位置 数据查询要素 数据查询功能结构图 无 数据查询功能流程图 数据删除功能 删除指定的存储数据 数据删除要素 数据删除功能结构图 数据删除功能流程图 数据新增功能/数据入栈 数据新增实际为入栈方法,即添加到栈顶 数据新增要素 待入栈的数据 数据新增功能结构图 无 数据新增功能流程图 无 数据插入功能 数据插入根据指定位置插入栈中 数据插入要素 数据插入功能结构图 无 数据插入功能流程图 出栈方法 移除栈顶元素 出栈要素 栈顶位置top 出栈功能结构图 无 出栈功能流程图 无 方便性能力 空栈判断方法 空栈判断要素 空栈判断方法功能流程图 栈长度方法 栈长度方法 获取第一个入栈数据方法 返回栈底元素 获取最后一个入栈数据方法 返回栈顶元素 程序结构图 程序处理流程图 TODO query查询方法 remove删除方法 push入栈方法 insert插入方法 pop出栈方法 is_empty空栈判断方法 get_size获取栈大小的方法 first返回栈底数据 last返回栈顶数据 程序实现 TODO ...
js学习笔记(8)——对象、类与面向对象编程
Li Guangqiao - 31/07/2023
对象、类与面向对象编程 理解对象 创建自定义对象的通常方式是创建Object的一个新实例: let person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function() { console.log(this.name); }; //前面的例子 let person = { name: "Nicholas", age: 29, job: "Software Engineer", sayName() { console.log(this.name); } }; 属性的类型 数据属性 [[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。注:默认所有直接定义在对象的属性的这个特性都是true。 [[Enumberable]]:表示属性是否可以通过for-in循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是true。 [[Writable]]:表示属性的值是否可以被修改。默认情况下,所以直接定义在对象上的属性的,这个特性都是true。 [[Value]]:包含属性实际的值。这就是前面提到的那个读取和写入属性值的位置。这个特性的默认值为undefined。 查看对象属性的方式:Object.getOwnPropertyDescriptor方法 var obj = { "name":"test" }; console.log(Object.getOwnPropertyDescriptor(obj, 'name')) //output //{ value: 'test', writable: true, enumerable:...
rust学习(五)迭代器和闭包
Li Guangqiao - 16/07/2023
函数式编程 Rust不像其他面向对象编程语言那样喜欢通过类来解决问题,而是推崇函数式编程。 什么是函数式编程 函数式编程是指将函数作为参数值或其他函数的返回值,在将函数赋值给变量之后执行。其中函数式编程的两个重要构件,分别是闭包和迭代器。 闭包 闭包是一种可以保存变量或者作为参数传递给其他函数使用的匿名函数。闭包可以在一处创建,然后在不同的上下文中执行。与普通函数不同,闭包允许捕获调用者作用域中的值,闭包特别适合用来定义那些只使用一次的函数。 //伪代码 //定义普通函数 fn func_name(func_parameter) -> func_return_type{ code_body; return_type } //定义闭包 |func_parameter| { code_body; return_value } 注意: 闭包也可能没有参数,同时返回值也可写可不写。Rust会自动推断闭包的参数类型和返回值类型,所以参数和返回值类型都可以不写。为了使用闭包,只需要将其赋值给变量,然后像调用函数一样调用它即可。 let count = |x:i32|->i32 { x+1 }; let num = 3; ...
rust学习(六)智能指针
Li Guangqiao - 16/07/2023
智能指针 概念 指针是包含内存地址的变量,用于引用或只想其他的数据。 Rust中最常见的指针是引用,而引用只是一种普通指针,除了引用数据之外,没有其他功能, 智能指针则是一种数据结构,其行为类似于指针,含有元数据,且在大部分情况下拥有指向的数据,提供内存管理或者绑定检查等附加功能,如管理文件句柄和网络连接。例如Rust中的Vec、String都可以看作智能指针。 Rust语言为智能指针封装了两大Trait,当变量实现了这两个Trait后就不再是普通变量: Deref 实现了Deref后,变量重载了解引用运算符*****,可以当作普通引用来使用,必要时可以自动或手动实现解引用。 Drop 实现Drop后,变量在超出作用域时会自动从堆中释放,当然还可以自定义实现其他功能,如释放文件或网络连接。 特征 智能指针在大部分情况下具有其所指向数据的所有权 智能指针是一种数据结构,一般使用结构体来实现 智能指针实现了Deref和Drop两个大trait 名称描述实际作用 Box<T>一种独占所有权的智能指针指向存储在堆上且类型为T的数据 Rc<T>一种共享所有权的计数智能指针用于记录存储在堆上的值的引用数 Arc<T>一种线程安全的共享所有权的计数智能指针可用于多线程 Cell<T>一种提供内部可变性的容器,不是智能指针允许借用可变数据,编译时检查,参数T要求实现Copy trait RefCell<T>一种提供内部可变性的容器,不是智能指针允许借用可变数据,运行时检查,参数T不要求实现Copy trait Weak<T>一种与***Rc<T>***对应的弱引用类型用于解决***RefCell<T>***中出现的循环引用。 Cow<T>是一种写时复制的枚举体智能指针我们使用***Cow<T>***主要是为了减少内存分配和复制,***Cow<T>***适用于读多写少的场景。 Pin<T>Rust 标准库中的另一种智能指针类型用于解决在异步编程和使用不稳定的 APIs 时,对象被移动的问题。Pin 可以用于固定***(pin)***一个对象的内存地址,确保它不会被移动。 自定义智能指针 定义一个结构体MYBOX use std::ops::Deref; //定义一个泛型参数的元组结构体 struct MYBOX<T>(T); //为元组结构体实现一个创建实例的方法 impl<T> MYBOX<T> { fn new(x:T) -> Self{ Self(x) } } 结构体实现Deref特征 impl<T> Deref for MYBOX<T> { type Target = T; fn deref(&self) -> &Self::Target { ...