一直听说 Rust 性能好,速度快,再加上最近想学习一下 wasm ,准备尝试一下。解释型语言写习惯了,再来开始学 Rust 确实有很多思路需要转变一下。《前端的 Rust 学习之路》系列长期更新,欢迎各位同行指正~

开始

什么是 Rust

Rust 是一门系统编程语言,以高性能,速度快,安全而著称,支持函数式,命令式以及泛型等编程范式的多范式语言,通过其特殊的所有权系统来保证安全性,在语法上类似 C++ 。

当然对作为前端,喜欢js, py并且对Java深恶痛绝的我来说,主要关注的是 Rust 是一门跟上述两者截然相反的、需要编译的静态类型语言,需要有明确的类型注解,跟咖啡相比,它很简洁!!!!!😅

如何安装?

安装很容易,官网根据对应系统安装即可,下面简单介绍。

windows

官网找到对应版本 rustup 下载安装即可,rustup 是 rust 的安装工具,安装完成之后 CMD 执行

1
rustc -V

输出版本号表示安装成功,rustup 同时为我们安装了 rustccargo

rustc 就是 Rust 的官方编译器,编译器也就是我们常说的语法分析、类型检查这一步,当然 rustc 干的也不止这两件事。代码写完之后需要编译,这就是 Rust, Java 这种强类型语言跟 js, py 的区别之一了😆

cargo 是 rust 的构建工具和包管理工具,构建稍大一些的 rust 项目需要用到它。

linux

执行

1
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

按步骤操作,安装 rustup 工具。除此之外,还建议安装 rust-src, rust-analyzer, rust-analysis,提高开发效率。

1
rustup component add rust-src rust-analyzer rust-analysis

rust-src 包含rust标准库的源代码,主要是为 rust-analyzer 的类型定义跳转功能提供支持。

rust-analyzer 是Rust的语言服务器,主要给IDE提供自动补全、类型推导、类型定义调整、错误检测等功能。

rust-analysis 是为Rust标准库预先计算机的分析数据,当我们需要标准库的定义时,rust-analyzer 能通过 rust-analysis 更快地给出反馈。

IDE

我选择的是windows+vscode+rust-analyzer,vscode扩展商店搜索rust-analyzer安装即可。
也可以使用其他的ide和编辑器:

  • IntelliJ IDEA,安装 IntelliJ Rust plugin。
  • Sublime Text
  • Atom

都有对应的Rust扩展或插件可供选择

使用

先向世界问个好

自从著名的计算机科学家,C语言之父,UNIX之父丹尼斯·里奇(Dennis Ritchie)和《C程序设计语言》作者布莱恩・柯林汉(Brian Kernighan) 用 “Hello World” 程序介绍了C语言后,在UNIX世界里,我们学习的任何新编程语言第一步都会这样做,这已经成为一种习惯。

如今,我们也用 Rust 编写一个 Hello World 程序
新建一个目录,目录里新建文件 main.rs,然后输入:

1
2
3
4
5
fn main(){

println!("Hello World!");

}

怎么样,跟严(you)谨(chou)安(you)全(chang)的咖啡相比,语法是不是很简洁🤣
然后控制台依次执行:
1
$ rustc main.rs

1
2
3
$./main   //Linux
$./main.exe //windows
Hello World!

main函数

在Rust里,使用 fn 来声明一个函数,后面跟的 main 表示函数名,另外 main 是一个特殊的函数,作为程序入口,在程序启动时运行 main 函数中的代码。

println!

跟很多语言的 print printf 一样,rust中 println 用来打印输出,prinkln 的第一个参数必须为字符串,也接受通配符及命名参数等形式。

通配符

1
2
println!("今天是 {} 年 {} 月 {} 日", 2023, 8, 11);
//今天是 2023 年 8 月 11 日

通配符 + 位置

1
2
println!("小明今年{0}岁,小华今年{1}岁,小美今年也{0}岁", 16, 15);
//小明今年16岁,小华今年15岁,小美今年也16岁

通配符 + 命名参数

1
2
println!("今天是 {year} 年 {month} 月 {day} 日", year = 2023, month = 8, day = 11);
//今天是 2023 年 8 月 11 日

此外还支持规定对齐方式,对齐宽度、转换进制、保留位数等等。还比较特殊的是它不是函数,而是一个宏,在 rust 中存在一个宏的概念。

宏类似函数,以(!)来区分,在 rust 中一个类似函数调用但是括号之前有(!)的语句,就是一个宏。

这里先简单了解,后面再详细学习宏和函数的知识。

使用cargo创建项目

rust作为强类型语言,在运行之前存在一个编译过程,不像 js 是在运行时才进行语法校验。在上文中,我们创建文件之后使用 rustc ,然后直接运行编译产物,一些简单的需求可以,但是在实际项目中,我们使用 cargo 来创建、开发、维护和管理项目,简单来说,就像是 npm 之于 js。

创建项目

1
2
$ cargo new hello_world
$ cd hello_world

上述命令中,我们使用 cargo 创建了一个 hello_world 项目,cargo 会创建项目结构和配置文件。目录结构如下:

1
2
3
4
5
6
$ tree
├── .git
├── .gitignore
├── Cargo.toml
└── src
└── main.rs

cargo.toml 包含了项目描述、项目依赖等信息,很好理解,就是 npm 中的 package.json 。项目第一次构建成功之后还会生成 cargo.lock 文件,包含项目所有的详细依赖清单,同样的,就是 npm 中的 package-lock.json

运行

main.rs 中写入:

1
2
3
fn main(){
println!("Hello World!");
}

运行

1
2
3
4
5
$ cargo run
Compiling hello_world v0.1.0 (E:\Projects\rustProjects\hello_world)
Finished dev [unoptimized + debuginfo] target(s) in 0.24s
Running `target\debug\hello_world.exe`
Hello, world!

能看到输出: “Hello, world!” 。

cargo run 做了两件事,一是编译,二是运行。而我们也是可以手动分布来编译运行项目:
编译

1
2
$cargo build
Finished dev [unoptimized + debuginfo] target(s) in 0.00s

运行
1
./target/debug/hello_world

编译会产生一个 target/debug 目录,代表我们目前使用 debug 模式,在这个模式下,项目的编译速度会很快,方便我们开发,但是运行速度就会降低。当我们需要高性能的编译产物时,需要添加 --release 来编译。
例如:
1
2
cargo run --release
cargo build --release

运行一下我们的高性能代码:
1
2
./target/debug/hello_world
Hello, world!

cargo check

当项目十分庞大之后,不管是 cargo run 还是 cargo build 都会变得缓慢,这时可以使用 cargo check 命令来快速检查项目是否能成功编译。速度非常快,会是我们开发过程中最常用的 cargo 命令之一。

总结

rust是一门以高性能、速度快、安全而著称的静态类型语言,我们使用 Hello world! 迈出了学习 rust 的第一步。下篇文章我们学习 rust的变量和不变性 以及其不同于 JS 的一些概念。