2020 Rust 入门 (1)
我们身边人知道 Rust 这门语言并不多,那么今天就来给大家介绍一下Rust 。大家可能最关心的是学了 Rust 能够干什么
- 写操作系统
- 写浏览器
- 写web应用
- 写游戏
- 写编译器
- 写区块链
呵呵一下子扩宽你的路子了
官网提供一本book,通过做书中 demo 来简单介绍一个,难得找到一个可以 cpp 较量一下语言。之前一直以为要做底层就必须学习 cpp 现在终于有了新的选择 Rust。Rust 安装准备单拿出来说一说,还是需要费一番力气的。可以自己找一下安装的教程,紧靠官方好像有点问题。一门好的语言标配是有一个项目管理工具,javascript 之所有这么火也是离不开 npm 的好用。
rust 也提供自己包管理工具 cargo,创建项目语句如下
cargo new guess_game
IDE 用 Visual studio code
先写一个 Hello World,第一眼就看出点现代语言的气息。fn 表示这门语言应该是简洁想到了 go println 还有点 python 味道。
fn main() {
println!("Hello, world!");
}
我们看一看项目结构吧,也是比较简洁
- src 文件夹放置我们的代码
- target 文件夹应该build 后可以运行问题件,
- Cargo.toml 应该类似配置文件,如果是前端出身类似 package.json,项目信息和依赖关系都会记录在这个文件
- cargo.lock 表示版本依赖之间兼容性,避免因为不兼容而造成更新库应用无法运行问题
[package]
name = "guess_game"
version = "0.1.0"
authors = ["zhangyv <zidea@163.com>"]
edition = "2018"
[dependencies]
简单描述这个游戏,就是一个猜数字的游戏。许多语言的入门教程也采用过这个消息。在一定范围内生产一个随机数字。然后玩家输入一个数字,给出提示您输入数字与目标数字大小关系,然后玩家根据提示继续猜数字直到猜中为止。
use std::io;
fn main() {
println!("Guess the number!");
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
创建字符串,这里 mut 表示是一个可变变量
let mut guess = String::new();
- println 输出
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
将用户输入写入引用变量 guess
在 Visual Studio code 只要鼠标悬停在方法,就给出提示还是很友好,可能还有强大的 IDE,这里还是比较喜欢 VSCode , 继续努力,用 vim 来写 rust 下一个目标
pub fn expect(self, msg: &str) -> T
Unwraps a result, yielding the content of an Ok.
Panics
Panics if the value is an Err, with a panic message including the passed message, and the content of the Err.
Examples
Basic usage:
let x: Result<u32, &str> = Err("emergency failure");
x.expect("Testing expect"); // panics with `Testing expect: emergency failure`
[dependencies]
rand = "0.5.5"
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
println!("You guessed: {}", guess);
}
let secret_number = rand::thread_rng().gen_range(1, 101);
调用 rand 提供的 gen_range 方法来生产随机数一个 1 到 101 之间随机数,
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
println!("Guess the number!");
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("The secret number is: {}", secret_number);
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = guess.trim().parse()
.expect("Please type a number!");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
match 有点类似与 switch 应该流行语言的影子,在 kotlin 中好像看到过,随后详细解释如何使用 match 估计支持正则吧和 lambda 表达式。
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("Guess the number!");
println!("The secret number is: {}", secret_number);
loop{
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = guess.trim().parse()
.expect("Please type a number!");
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win!"),
}
}
}
这里使用 loop 循环执行代码,我们生成随机数语句从循环体中拿出来,如果每一次都随机生产随机数,这里游戏就没法玩了。接下来我们要解决问题是,当玩家输入非数字时,例如字符串,处理回到循环体起始,这里还是说一点 parse()返回一个类,类包换两个接口分别在 OK 方法中得到返回值,发生异常可以在 Err() 方法得到异常信息,这里我们就不接收异常,而直接退回到循环体起始位置。
use std::io;
use std::cmp::Ordering;
use rand::Rng;
fn main() {
let secret_number = rand::thread_rng().gen_range(1, 101);
println!("Guess the number!");
println!("The secret number is: {}", secret_number);
loop{
println!("Please input your guess.");
let mut guess = String::new();
io::stdin().read_line(&mut guess)
.expect("Failed to read line");
let guess: u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
println!("You guessed: {}", guess);
match guess.cmp(&secret_number) {
Ordering::Less => println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => {
println!("You win!");
break;
}
}
}
}
如果给出正确答案,我们希望推出游戏,这里用 break 语句退出 loop。
Ordering::Equal => {
println!("You win!");
break;
}