写在最前面,想聊一聊为什么突然心血来潮想学rust。
老前端人刚经历了裁员,面试问前端问出花也就是那些前端八股文,然后基本就是些项目,做的多深、多广。有没有在某一方面玩出花来?思来想去前端能做的无非就这些(组件库、低代码、页面性能优化、工程化等等)。八股文背了一堆,渐渐的就是中小厂好面,开不到你要的工资,大厂一面二面就得挂,你这个年纪凭什么让你去大厂打螺丝?要么架构师,要么滚蛋。让我这个一直混日子的老年人很难~
所以就萌生了反正前端我也进步不了了,能干的活就这么干着。学点其他的能用的上就用,用不上拉倒。省的每次某乎一堆《如何评价前端是否是程序员?》这种傻X题目,看着就想骂,又™觉得有点道理,这™,只能说弯路走错了10年?
whatever,闲着也是闲着,随便瞎学点瞎写点东西吧。
ps: 书看的是《Rust权威指南》,下面的内容算笔记,所以不成文,读者见谅。本人建议去看书~
关于rust是一个静态类型语言,然后特性主打的是高性能、内存安全和并发性,网上一大堆,随便了解下就行,反正我觉得比node牛逼,不需要我随便干点啥都是要考虑多进程开销,然后进程守护,以及服务编排后的一致性问题了。当然,rust做企业应用,分布式架构还是重中之重。我只是在说一个简单的前端工具(错误监控,微服务等)。
安装Rust
环境是学习的起点,毕竟我想搭个helloWorld,也得先搭个环境。
- Linux或者macOS环境安装rust
$ curl https://sh.rustup.rs -sSf | sh
这条命令会下载并执行一个脚本来安装rustup工具,进而安装最新的rust稳定版本。
装完了之后会提示你安装成功。关掉终端重新打开就能用,或者手动运行下面命令让配置立即生效:
$ source $HOME/ .cargo/env
-
Windows环境安装Rust
建议百度,咱还是建议写前端还是用mac把,毕竟咱公司前端比服务端唯一高贵的只剩前端公司配mac,服务端只配Lenovo了[微笑]。
Hello World
main.rs文件里写:
fn main() {
println!("Hello, world!");
}
然后当前目录执行
$ rustc main.rs
$ ./main
Hello, world!
成功,其中rustc main.rs类似于tsc main.ts,将main.rs文件编译成二进制可执行文件main,然后./main
直接执行它。
OK,你已经学会rust了,作为一个前端,你已经可以跟别的前端吹牛逼说你会rust了。
工具集(类似npm)
咱不建议使用
rustc xxx
,rust有自带的包管理工具,能给你搭项目,然后执行打包、运行、校验啥的,有点类似我们的npm包管理工具。
cargo new xxx // 创建新项目
cargo build // 打包测试环境代码
cargo build —release // 打包线上环境
cargo run // 类似npm run dev,本地运行
cargo check // 检查是否有错,是否可以编译通过,类似ts需要编译的场景
-
工程目录
-
src → 项目开发文件
-
target → 编译后的文件
- debug → cargo build的文件
- release → cargo build —release 的文件
-
Cargo.toml → 类似package.json
-
这一趴很短,可以自己试试,很简单。hello world跑起来就行。这里顺便吐槽一句,RN真是垃圾,跟着官方文档楞是跑不起来项目,直接裂开,还是Rust好~
通用编程概念
- let
- let是变量,但是是个不可变变量,咱可不能当成js一样。
- 变量想让其可变,得加个关键字mut
let a = 1;
a = 2; // 报错
let mut a = 1;
a = 2; // 正确
为啥设计成不可变的,官方的说法是为了安全性,这样你就不会在某处不小心的将不可变的变量更改,从而导致无法察觉的bug,rust会在编译时帮你找出错误。
当然可变性也有好处,所以他们提供了关键字来显示声明变量可变。
- 另外let类型可以隐藏,即重新定义新的同名的变量,会将上面的let赋值的变量隐藏,即
let a = 1;
let a = a + 1;
let a = a * 2; // a = 4;
let a = "123";
- const是常量,是不可变的,无法使用mut
const MAX_AGE = 150;
数据类型
-
标量类型
-
整数
-
其中arch在32位系统就是32位,在64位系统就是64位
长度 有符号 无符号 8-bit i8 u8 16-bit i16 u16 32-bit i32 u32 64-bit i64 u64 arch isize usize
-
关于有符号和无符号,前端同学如果不了解可以去搜搜,大致就是数字最后都是二进制,比如8位的有符号整形,他左边第一位就是符号位,0表示正数,1表示负数,所以数字的表示范围是2^7-1(01111111) ~ -2^7 (10000000)-> 负数用补码计算,具体建议百度。
-
-
浮点数
因为在rust中,运行效率两者几乎相同,而双精度可以表示的数值范围更广,所以默认使用f64。
- 有符号的单精度 f32 → 占4个字节
- 有符号的双精度 f64 → 占8个字节
-
布尔类型
- true
- false
-
字符类型
- char 表示一个字符,占4位
-
复合类型
-
元组(tuple)-> 类似js中的数组,但是长度不可变
定义了后长度不可变,可以放不同类型的元素,可以解构。
let tup: (i32, f64, u8) = (500, 6.4, 1); // 取值 println!("{}", tup.0); println!("{}", tup.1); println!("{}", tup.2); // 解构 let (x, y, z) = tup;
-
数组(array)
数组中每个元素都必须是相同的元素
let arr: [i32; 5] = [1,2,3,4,5]; let arr1 = [3; 5]; // [3, 3, 3, 3, 3] // 访问数组 let first = arr[0];
-
ps: js中的数组不是严格意义上的数组,我猜应该是链表实现的,因为数组的要求是类型相同,才能确定每个下标需要的字节数相同,也就方便去根据寻址公式O(1)的查询对应下标的地址。
好了,第一天学这么多已经够了,脑子要💥了,老年人只有这么点大的脑容量。有机会的话下个礼拜再见👋🏻。