rust
是一门静态类型语言,内存高效,速度快,在命令行
,webAssembly
,网络服务,嵌入式,web3
方向有广泛应用,以下是一篇rust
入门笔记。
开始学习rust
的第一步
rust安装
- 安装
rust
环境,具体参考官方install教程rust-lang
bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
- 安装完成后开始第一个
hello rust
bash
cargo new 01-hello-rust --name hello-rust
当我们在终端执行以上命令后,就会生成下面几个文件
当我们在项目根目录执行cargo run
,此时就运行了rust
写的第一个项目了,并打印出了了main.rs
文件
rust
fn main() {
println!("Hello, rust!");
}
我们的终端运行命令后
rust
Finished dev [unoptimized + debuginfo] target(s) in 0.03s
hellRunning `target/debug/hello-rust`
Hello, rust!
我们注意到在基础项目里有一个Cargo.toml
的文件,这是在rust
工程文件使用cargo
创建项目后生成的文件,其中有默认的几个参数
- name 该项目的名称
- version 版本号
- edition 为年份
- [dependencies]依赖安装的包
rust
[package]
name = "hello-rust"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
当你使用cargo run
时,此时src
目录下除了原有的main.rs
文件,也会多生成一个可执行main.exe
文件
猜数游戏
首先我们使用cargo
创建一个项目
rust
cargo new guess-game
我们具体看下代码
rust
use rand::Rng;
use std::io;
fn main() {
println!("猜数字游戏");
println!("请输入一个1到100之间的数字");
// 用let定义了一个不可变的变量
let secret_number = rand::thread_rng().gen_range(1..=100);
// rust中的循环使用loop关键词
loop {
// 申明一个可变的变量,且为字符串类型存储输入值
let mut input = String::new();
// 使用io读取输入的值
io::stdin()
.read_line(&mut input) // 这里引用的上面同一个input的值
.expect("failed to read line"); // 防止系统报错
// 将输入的字符串变为数字
let input: u32 = input.trim().parse().expect("Please type a number!");
// 比较输入值与随机数的大小,这里使用match 关键词,&secret_number是一个形参
match input.cmp(&secret_number) {
// 使用Ordering的枚举
std::cmp::Ordering::Less => println!("太小了!"),
std::cmp::Ordering::Greater => println!("太大了!"),
std::cmp::Ordering::Equal => {
println!("恭喜你,猜对了!");
break; // 中指退出loop循环
}
}
}
}
至此我们一个猜数字的程序就已经写好了,看代码似乎还有很多疑问。
- 首先我们在使用随机数时,主要是由于我们引入了
use rand::Rng
,在我们使用这个1-100
随机数时,是直接使用定义了一个不可变量screct_number
,rand::thread_rng().gen_range(1..=100)
在使用rand
时,我们必须在Cargo.toml
的[dependencies]
写入rand = "0.8.5"
,当我们首次运行时,就会安装rand
相关的包
-
我们在读取用户输入值时,我们使用了
use std::io
,在读取用户输入的值,我们使用io::stdin().read_line(&mut input)
-
我们多次使用的
input
这个变量,在rust
中是允许同一个变量名被定义多次的,最近的一次引用取最近的一次定义
比如下面
rust
fn main() {
let name = 'Web技术学苑';
println!("{}", name); // Web技术学苑
let name = "Maic";
println!("{}", name); // Maic
}
-
当我们使用循环时,我们使用了
loop
,使用{}
代码块包裹 -
在使用
match
时,match input.cmp($screct_number)
,并且接着代码块是非常奇怪的语法
rust
match input.cmp($screct_number) {
std::cmp::Ordering:Less => println!("太小了"),
std::cmp::Ordering:Greater => println!("太大了"),
std::cmp::Ordering:Equal => {
println!("恭喜你,猜对了");
break; // 中断loop循环
}
}
Ordering:Less
是引入的枚举,至于为啥这么写,还是需要慢慢适应 $screct_number
是一个不可变的形参
println!
关于打印,我们在项目中主要是为了方便调试的,在rust
中打印俗称宏
{}
是占位符,可以{a}中的a是最近定义的变量- 在
{0}{1}
表示获取参数的第一个值与而个值 - 可以定义
{name}
中的参数名
rust
fn main() {
// 输出后会换行
println!("Hello, world!");
// 不会换行
// print!("hello i is print");
// {},{}会一一占位hello world
println!("{} {}", "hello", "world");
// 0 hello 1 world
println!("{0} {1} {0}", "a", "b");
// 命名参数
println!(
"{name} likes to play {activity}",
name = "John",
activity = "Baseball"
);
// 输出的结果是:000001
println!("{number:>0width$}", number = 1, width = 6);
}
总结
-
如何安装
rust
,以最基础的例子hello rust
入门rust
-
用
猜数字
游戏了解rust
,我们使用std
与rand
这两个库实现了输入数字猜数游戏 -
在
猜数字
游戏中我们学习了解到如何定义可变变量与不可变量,以及如何使用循环,字符串转数字,以及使用Ordering
枚举,中断循环等 -
了解
println!
通用的打印,通常{}
是一个变量占位符