- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
所谓工欲善其事必先利其器,我们学习Rust当然需要安装Rust。我们可以从 Rust官网 下载 rustup 工具进行rust的安装。安装完成后,我们在命令行中输入 rustc --version 便可以查看我们所安装rust的版本.
笔者推荐在Windows平台使用 PowerShell Core 和 Windows Terminal 。
安装好 rust 后,我们需要了解几个东西 。
rustc 是 rust 的编译器,负责将 rs 文件源码编译到可运行文件或者库的二进制代码 。
rustup 是 rust 的升级管理工具,负责升级 rust 的版本,常用命令 rustup update 用来升级 rust 。
一般都不直接使用 rustc 来直接编译 rs 文件,而是选择 cargo 。 cargo 是 Rust 的包管理器,可以用来创建项目、安装依赖、类型检测、编译、运行以及测试项目等功能。cargo 是一个功能强大的工具。 cargo run 能够自动化调用 rustc` 对 rs 文件进行编译产出二进制文件并运行二进制文件.
命令 | 说明 | 示例 |
---|---|---|
cargo new | 创建项目,默认创建 binary 项目,添加参数可以选择 lib 和 bin 两种项目 | cargo new hello --lib(默认--bin) |
cargo check | 类型检测 | cargo check |
cargo build | 编译项目 | cargo build [--release] |
cargo run | 运行项目,可以带参数 | cargo run [--release] |
cargo test | 对项目进行单元测试 | cargo test |
详细的说明可以查看 官方文档 .
现在能够开发 rust 的工具已经有很多了,比如 Jetbrains 家的 Clion (需要添加 rust 插件)或者 Microsoft家的 VS Code (需要安装rust-analyzer扩展) 。
既然已经有了 rust 的运行环境,那么我们便开始创建第一个 rust 项目。使用 cargo new hello-world 命令创建一个名为 hello-world 的项目,然后 cd hello-world 进入项目目录后可以看到项目的结构 。
C:.
│ .gitignore
│ Cargo.toml
│
└─src
main.rs
项目根路径会有一个 Cargo.toml 和一个 src\main.rs ,其中 Cargo.toml 文件是负责配置 cargo 和项目依赖项,main.rs 文件则是程序的入口点,main.rs 里的代码 。
fn main() {
println!("Hello, world!");
}
简单易懂,关键字 fn 用来声明这是一个无返回值名称为 main 的 function,然后函数体内调用 rust 的输出宏 println! 输出了 Hello, world.
在 Rust 中所有的函数调用都是必须有返回值的表达式,无返回值的返回一个空的 tuple 表示或者省略不写.
fn foo() -> () {}
// 二者等效
fn foo() {}
我们运行 cargo build ,对项目进行编译,默认情况下是生成带有 debug 信息并且没有优化的代码,可以得到下图所示内容 。
而添加 --release 参数后,则会生成不带 debug 信息且优化后的代码,如下图所示(这一般是在正式发布时使用) 。
执行 cargo build 命令后会在项目目录下生成一个 target 文件夹,target 文件夹中的内容就是编译生成的结果。根据 cargo build 后面添加的参数会生成两个文件夹,即 release 和 debug .
也可以直接运行 cargo run 命令直接运行项目,这个命令就相当于 cargo build && ./debug/hello-world.exe 先编译项目然后再执行编译后的可执行文件。和 cargo build 一样默认是生成 debug 代码,带上 --release 参数后则是 release 代码。 下图是 cargo run 所显示信息 。
下图是 cargo run --release 所显示信息 。
在项目文件夹中找到 Cargo.toml 文件,这个文件便是 Rust 项目的依赖项配置文件 在这个文件里对项目进行配置,比如我现在需要使用随机数,那么我只需要在 [dependencies] 下面添加 rand = "0.8.3" ,然后项目运行时,cargo 会自己进行依赖还原,将详细的包写入 Cargo.lock 文件中 并且会自动去解析引入包的依赖,这和 npm 相似.
我们现在可以写一个小游戏来走一遍 Rust 项目创建到运行的流程 使用 cargo new 创建一个新的项目,然后在 Cargo.toml 文件中的 [dependencies] 下面添加 rand = "0.8.3" 。
打开 main.rs ,并添加以下代码 。
use rand::Rng;
use std::cmp::Ordering;
use std::io;
fn guess() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1..101);
loop {
println!("Please input your guess.");
let mut buffer = String::new();
io::stdin()
.read_line(&mut buffer)
.expect("Failed to read line!");
let number: i32 = match buffer.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
match number.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
}
fn main() {
guess();
}
这些代码也很容易理解。 use std::io; 、 use std::cmp::Ordering; 和 use rand::Rng; 分别引入我们需要的模块。 std::io 用来获取输入的数字, std::cmp::Ordering 用来比较输入的数字和随机数的大小, rand::Rng 用来生成随机数。 然后我们声明了一个无参数和无返回值的函数 guess 。函数里主要是输出一行提示用户输入的提示信息和生成范围在[1,101)的随机整数,并根据用户输入的数字与随机数进行比较,直到用户猜测数字等于随机数字后结束程序。 我们需要处理用户的输入,在 rust 中使用 io::stdin().read_line() 从标准输入流中获取用户的输入,因为 read_line() 返回的是 Result<usize> ,在 rust 中 Result<T> 都可以使用 match(模式匹配)来对结果进行处理。 loop 在 rust 中是开启一个无线循环,根据内部的 break 来跳出循环,这里我们根据用户输入的数字和产生的随机数字比较结果作为是否结束循环的条件。在 rust 中,我们需要着重的学习 match 模式匹配,这里 number.cmp 返回一个 Ordering ,我们可以根据不同的结果进行不同处理,这和 if 条件判断类似,但是代码的可读性变高了,更利于理解,在 rust 中尽量使用模式匹配来进行逻辑判断以便减少 bug。 main 函数就是简单地调用 guess 函数.
使用 cargo run 后,我们会得到以下信息 。
至此,我们了解了 rust 的安装和各种命令以及创建并运行一个 rust 项目的所有流程.
部分内容和代码参考 Rust官网 。
最后此篇关于Rust-01启航的文章就讲到这里了,如果你想了解更多关于Rust-01启航的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!