老前端人学rust - 第一课

写在最前面,想聊一聊为什么突然心血来潮想学rust。

老前端人刚经历了裁员,面试问前端问出花也就是那些前端八股文,然后基本就是些项目,做的多深、多广。有没有在某一方面玩出花来?思来想去前端能做的无非就这些(组件库、低代码、页面性能优化、工程化等等)。八股文背了一堆,渐渐的就是中小厂好面,开不到你要的工资,大厂一面二面就得挂,你这个年纪凭什么让你去大厂打螺丝?要么架构师,要么滚蛋。让我这个一直混日子的老年人很难~

所以就萌生了反正前端我也进步不了了,能干的活就这么干着。学点其他的能用的上就用,用不上拉倒。省的每次某乎一堆《如何评价前端是否是程序员?》这种傻X题目,看着就想骂,又™觉得有点道理,这™,只能说弯路走错了10年?

whatever,闲着也是闲着,随便瞎学点瞎写点东西吧。

ps: 书看的是《Rust权威指南》,下面的内容算笔记,所以不成文,读者见谅。本人建议去看书~

关于rust是一个静态类型语言,然后特性主打的是高性能、内存安全和并发性,网上一大堆,随便了解下就行,反正我觉得比node牛逼,不需要我随便干点啥都是要考虑多进程开销,然后进程守护,以及服务编排后的一致性问题了。当然,rust做企业应用,分布式架构还是重中之重。我只是在说一个简单的前端工具(错误监控,微服务等)。

安装Rust

环境是学习的起点,毕竟我想搭个helloWorld,也得先搭个环境。

  • Linux或者macOS环境安装rust
bash 复制代码
$ curl https://sh.rustup.rs -sSf | sh

这条命令会下载并执行一个脚本来安装rustup工具,进而安装最新的rust稳定版本。

装完了之后会提示你安装成功。关掉终端重新打开就能用,或者手动运行下面命令让配置立即生效:

bash 复制代码
$ source $HOME/ .cargo/env
  • Windows环境安装Rust

    建议百度,咱还是建议写前端还是用mac把,毕竟咱公司前端比服务端唯一高贵的只剩前端公司配mac,服务端只配Lenovo了[微笑]。

Hello World

main.rs文件里写:

rust 复制代码
fn main() {
    println!("Hello, world!");
}

然后当前目录执行

bash 复制代码
$ rustc main.rs
$ ./main
Hello, world!

成功,其中rustc main.rs类似于tsc main.ts,将main.rs文件编译成二进制可执行文件main,然后./main直接执行它。

OK,你已经学会rust了,作为一个前端,你已经可以跟别的前端吹牛逼说你会rust了。

工具集(类似npm)

咱不建议使用 rustc xxx,rust有自带的包管理工具,能给你搭项目,然后执行打包、运行、校验啥的,有点类似我们的npm包管理工具。

arduino 复制代码
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
ini 复制代码
let a = 1;
a = 2; // 报错
let mut a = 1;
a = 2; // 正确

为啥设计成不可变的,官方的说法是为了安全性,这样你就不会在某处不小心的将不可变的变量更改,从而导致无法察觉的bug,rust会在编译时帮你找出错误。

当然可变性也有好处,所以他们提供了关键字来显示声明变量可变。

  • 另外let类型可以隐藏,即重新定义新的同名的变量,会将上面的let赋值的变量隐藏,即
ini 复制代码
let a = 1;
let a = a + 1;
let a = a * 2; // a = 4;
let a = "123";
  • const是常量,是不可变的,无法使用mut
ini 复制代码
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中的数组,但是长度不可变

      定义了后长度不可变,可以放不同类型的元素,可以解构。

    rust 复制代码
        let tup: (i32, f64, u8) = (500, 6.4, 1);
    
        // 取值
        println!("{}", tup.0);
        println!("{}", tup.1);
        println!("{}", tup.2);
    
        // 解构
        let (x, y, z) = tup;
    • 数组(array)

      数组中每个元素都必须是相同的元素

    ini 复制代码
    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)的查询对应下标的地址。

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

相关推荐
崔庆才丨静觅1 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60612 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了2 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅2 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅2 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅3 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment3 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅3 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊3 小时前
jwt介绍
前端
爱敲代码的小鱼3 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax