# 安装 rust
官网安装
# mac 系统安装 | |
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh |
# 常用命令
# 更新 | |
rustup update | |
# 卸载 | |
rustup self uninstall | |
# 安装验证,rustc x.y.z (commit_hash yyyy-mm-dd) | |
rustc --version | |
# 本地文档 | |
rustup doc |
# 开发工具
vscode,插件:rust-analyzer、另外一个 rust 插件已经弃用了
# hello world
- 文件后缀: .rs
- 命名规范:hello_world.rs
fn main() { | |
println!("Hello World!"); | |
} |
# 编译和运行
- 编译:rustc 文件名.rs
- 生成 .exe 可执行文件和 .pdb 调试文件
- rust 是 ahead-of-time 编译语言:不需要安装 rust 就可以运行执行文件
- rustc 适合编译简单的程序
# cargo
- cargo 是 rust 构建系统和包管理工具
- 查看是否安装:cargo --version
# 查看是否安装、版本号 | |
cargo --version | |
# 创建新项目 | |
cargo new 项目名称 | |
# cargo new hello_world | |
# --vcs 指定版本控制系统:默认 git; hg, pijul, or fossil, none |
# cargo.toml 介绍
[package]
- name: 项目名称
- version: 项目版本
- authors: 项目作者
- edition: rust 版本
[dependencies]
rust 里面,代码的包称作 crate
# cargo 构建和运行项目
- cargo build: 编译
- cargo run: 编译和运行
# cargo check 检查代码
- 检查代码,确保能通过编译,但是不产生可执行文件
- 比 build 快的多,编写代码可以连续反复 cargo check 检查代码,提供效率
# 为发布构建
cargo build --release
- 编译时会进行优化:编译时间久,代码运行快
- 会在 target/release 目录生成,而不是 target/debug
# 猜一个数:一次猜测
//prelude 没在预导入里面的,需要手工引入 use | |
use std::io; // prelude | |
fn main() { | |
println!("猜数:"); | |
println!("猜一个数(1-100):"); | |
// 1. 所有变量默认 immutable,如果要修改,则需要用 mut | |
// 2. 返回一个 String 对象实例,:: 关联函数 | |
let mut guess = String::new(); | |
// 1. stdin 关联函数返回一个 Stdin 的实例 | |
// 2. 引入默认也是不可变的,因此也需要 mut | |
// 3. read_line 返回 io::Result 枚举类型:Ok, Err | |
io::stdin().read_line(&mut guess).expect("读取错误!"); | |
// {} 占位符 | |
println!("你猜的数是: {}", guess); | |
} |
# 猜一个数:生成神秘数字
我们创建的项目是二进制 crate(可以独立运行);我们要引用一个依赖,这个是依赖 crate(不能独立运行)。
在 dependencies 下添加
rand = "0.3.14"
# Cargo.lock
cargo.lock 锁定当前依赖版本,保证每次编译生成相同东西,保证一致性;
如果修改依赖版本,则可以 cargo update 更新这个文件
cargo update
# 生成神秘数字
// 这是一个 trait,类似接口;rand::thread_rng () 需要 | |
use rand::Rng; // trait | |
use std::io; | |
fn main() { | |
println!("猜数:"); | |
let secret_number = rand::thread_rng().gen_range(1..101); | |
println!("神秘数字: {}", secret_number); | |
println!("猜一个数(1-100):"); | |
let mut guess = String::new(); | |
io::stdin().read_line(&mut guess).expect("读取错误!"); | |
println!("你猜的数是: {}", guess); | |
} |
# 猜一个数:比较猜测数字和神秘数字
// 这是一个 trait,类似接口;rand::thread_rng () 需要 | |
use rand::Rng; // trait | |
use std::cmp::Ordering; | |
use std::io; | |
fn main() { | |
println!("猜数:"); | |
let secret_number = rand::thread_rng().gen_range(1..101); | |
println!("神秘数字: {}", secret_number); | |
println!("猜一个数(1-100):"); | |
let mut guess = String::new(); | |
io::stdin().read_line(&mut guess).expect("读取错误!"); | |
println!("你猜的数是: {}", guess); | |
// 1. parse 后,需要指定类型,这里指定 u32;expect 就是异常中断程序处理 | |
// 2. 原本 secret_number 默认是 i32 类型; | |
// 因为后面 guess.cmp 与 secret_number 比较, | |
// 编译器自动推断 secret_number 类型也为 u32 | |
let guess: u32 = guess.trim().parse().expect("Please input a number!"); | |
//match 匹配,每个分支称为 arm | |
match guess.cmp(&secret_number) { | |
Ordering::Less => println!("Too small!"), | |
Ordering::Greater => println!("Too Big!"), | |
Ordering::Equal => println!("You win!"), | |
} | |
} |
# 猜一个数:多次猜测
use rand::Rng; | |
use std::cmp::Ordering; | |
use std::io; | |
fn main() { | |
println!("猜数:"); | |
let secret_number = rand::thread_rng().gen_range(1..101); | |
println!("猜一个数(1-100):"); | |
// 多次循环 | |
loop { | |
let mut guess = String::new(); | |
io::stdin().read_line(&mut guess).expect("读取错误!"); | |
println!("你猜的数是: {}", guess); | |
//expect 导致程序中断,不优雅,因此用 match 处理不同枚举情况 | |
let guess: u32 = match guess.trim().parse() { | |
// 直接返回结果 | |
Ok(num) => num, | |
// 不关心结果,用 _ 表现 | |
Err(_) => { | |
println!("请输入一个数字."); | |
// 跳出此次循环,但不停止循环 | |
continue; | |
} | |
}; | |
match guess.cmp(&secret_number) { | |
Ordering::Less => println!("Too small!"), | |
Ordering::Greater => println!("Too Big!"), | |
Ordering::Equal => { | |
println!("You win!"); | |
// 跳出并且停止此循环 | |
break; | |
} | |
} | |
} | |
} |