likes
comments
collection
share

老前端人学rust - 第一课

作者站长头像
站长
· 阅读数 12

写在最前面,想聊一聊为什么突然心血来潮想学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-biti8u8
        16-biti16u16
        32-biti32u32
        64-biti64u64
        archisizeusize

    关于有符号和无符号,前端同学如果不了解可以去搜搜,大致就是数字最后都是二进制,比如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)的查询对应下标的地址。

好了,第一天学这么多已经够了,脑子要💥了,老年人只有这么点大的脑容量。有机会的话下个礼拜再见👋🏻。