《Rust权威指南》
本书由 Rust 核心开发团队编写而成,由浅入深地探讨了 Rust 语言的方方面面。从学习函数、选择数据结构及绑定变量入手,逐步介绍所有权、trait、生命周期、安全保证等高级概念,模式匹配、错误处理、包管理、函数式特性、并发机制等实用工具,以及两个完整的项目开发实战案例。 作为开源的系统级编程语言,Rust 可以帮助你编写出更为快速且更为可靠的软件,在给予开发者底层控制能力的同时,通过深思熟虑的工程设计避免了传统语言带来的诸多麻烦。 本书被视为 Rust 开发工作的必读书目,适合所有希望评估、入门、提高和研究Rust语言的软件开发人员阅读。
[!tip]- 作者简介
Steve Klabnik,Rust文档团队负责人,Rust核心开发者之一,Rust布道者及高产的开源贡献者,此前致力于Ruby等项目的开发。
Carol Nichols,Rust核心团队成员,i32、LLC联合构建者,Rust Belt Rust会议组织者。
毛靖凯,游戏设计师,一直专注于游戏领域研发,曾负责设计和维护了多个商业游戏的基础框架。业余时间活跃于Rust开源社区,并尝试使用Rust来解决游戏领域中的诸多问题。
唐刚,资深开发者,Rustcc社区创始人和维护者之一。目前就职于Cdot Network。使用Rust从事区块链共识协议的开发工作。
沙渺,嵌入式开发者,国内Rust语言社区和Raspberry Pi(树莓派)开发社区早期参与者。负责维护多个RISC-V架构硬件平台的基础函数库。
🗒️我的笔记
Rust简介
主要是看视频 https://www.bilibili.com/video/BV1hp4y1k7SV?p=2&spm_id_from=pageDriver
Rust 特别擅长的领域:
- 高性能 Web Service
- WebAssembly
- 命令行工具
- 网络编程
- 嵌入式设备
- 系统编程
Rust优点:
- 性能
- 安全性
- 无所畏惧的并发
install
https://www.rust-lang.org/
安装 in mac
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
更新:
rustup update
卸载Rust
rustup self uninstall
验证安装:
rustc --version
查看本地文档:
rustup doc
hello world
rustc main.rs
编译
Rust的缩进是4个空格而不是tab
println! 是个宏。函数是没有!的。
rustc 只适合简单的Rust程序。
hello Cargo
复杂的程序得用Cargo。
Cargo是Rust的构建系统和包管理工具。
- 构建代码、下载依赖的库、构建这些库…
创建项目 cargo new xxx
cargo build
编译构建项目。会生成target
目录,可执行文件就在里面。
cargo run
会编译 并运行项目。
cargo check
检查项目,比build快很多。
为发布构建,得加参数--release
cargo build --release
编译时会进行优化,编译的更慢,生成的执行文件运行的更快。
猜数游戏
use std::io; // 引用标准库
fn main() {
println!("猜数!");
println!("测试一个数");
let mut guess = String::new(); // let 默认声明常量。加上mut才是变量。 new类似于静态方法调用。
io::stdin().read_line(&mut guess).expect("无法读取行"); // &表示按引用传递。 expect表示错误处理。 Can
println!("你猜测的数是:{}", guess); //{}是占位符。类似于%s
}
rust中库不叫lib, 而是叫crate.
为了生成随机数,得引用一个叫rand的crate。
直接在Cargo.toml
里添加即可。
[dependencies]
rand = "0.3.14"
版本依赖会存到Cargo.lock
中,更新版本时也会更新Cargo.lock
trait 类似于其他语言的接口。
match guess.cmp(&secret_number) {
Ordering::Less=>println!("Too small!"),
Ordering::Greater => println!("Too big!"),
Ordering::Equal => println!("You win"),
} // match 类似于其他语言里的switch.
match 类似switch
loop 引入无限循环。break 退出循环。
如果要处理异常,而不是直接panic, 就需要去掉expect
, 改成match
自己匹配了。
完整的代码:
use std::cmp::Ordering;
use std::io;
use rand::Rng;
fn main() {
println!("猜数!");
let secret_number = rand::thread_rng().gen_range(1,101); // i32 u32 i64
// println!("神秘数字是:{}", secret_number);
loop {
println!("测试一个数");
let mut guess = String::new();
io::stdin().read_line(&mut guess).expect("无法读取行");
println!("你猜测的数是:{}", guess);
// shadow
let guess:u32 = match guess.trim().parse() {
Ok(num) => num,
Err(_) => continue,
};
match guess.cmp