Rust 教程

20 篇 · 共 5 章

写给已经会一门带 GC 的语言(Java / Go / JavaScript / C# / Python)、 第一次认真学 Rust 的人。不从「什么是变量」讲起,也不按语法元素 平均分配篇幅 —— 这类读者会卡住的地方只有一个:代码看着没问题,编译器就是不让过。所以所有权那一章占了全书最大的篇幅,而基础语法压成一篇。

章节顺序就是阅读顺序,从头读最省事。 全部示例都是能单独编译的完整程序,每次构建前由npm run test:rust 用真的 rustc 跑一遍 —— 「这段编译不过、报的是 E0382」这种话,在这里是被验证过的断言,不是印象。

知识点清单参考过runoob 的 Rust 教程做覆盖度核对 —— 章节划分与全部正文为本站自行编写,未复制其内容。

按错误码查

被编译器拦下来的时候,你手上唯一确定的东西就是那个E0xxx。下面每一条都对应一个跑得出这个错误码的完整示例。

错误码这条示例在演示什么出处
E0038`dyn` 的代价:不是所有 trait 都能做成 trait 对象泛型、trait 与 dyn
E0106借用不能比被借的东西活得久借用:& 与 &mut 的两条规则
E0106结构体里存引用,就得带上标注生命周期标注到底在说什么
E0117孤儿规则:别人的类型 + 别人的 trait = 不行泛型、trait 与 dyn
E0277🚨 `Rc` 过不了线程边界,`Arc` 可以并发与 Send / Sync
E0277`?` 只能用在返回 `Result` 的函数里 —— `main` 也可以是Result 与 ?:没有异常怎么活
E0277字符串不能用数字下标切片:借用一段,而不是整个
E0282同样是「推不出来」,报的码可能不一样语法速通:给已经会编程的人
E0308🚨 唯一非用 `dyn` 不可的场合:一个容器装多种类型泛型、trait 与 dyn
E0308不同宽度的整数不会自动转换为什么是 Rust:既没有 GC,也不用手动 free
E0369`assert_eq!` 要求类型能比较、能打印测试与 cargo test
E0381没初始化就用,是编译错误不是垃圾值为什么是 Rust:既没有 GC,也不用手动 free
E0382赋值就是移动:原变量当场失效移动:赋值为什么会让变量失效
E0382函数传参也是一次移动移动:赋值为什么会让变量失效
E0382部分移动:拿走一个字段,整体就不完整了移动:赋值为什么会让变量失效
E0499规则二:可变借用同时只能有一个借用:& 与 &mut 的两条规则
E0502真实形状:边遍历边往里加借用:& 与 &mut 的两条规则
E0502规则二的另一半:可变借用不能和不可变借用共存借用:& 与 &mut 的两条规则
E0502切片是借用,所以它会挡住对原串的修改切片:借用一段,而不是整个
E0507从容器里「拿」一个出来,拿不走移动:赋值为什么会让变量失效
E0596🚨 `Rc` 里的东西改不了 —— 除非套一层 `RefCell`智能指针与内部可变性
E0597🚨 标注不延长任何东西生命周期标注到底在说什么
E0599类型逼着你处理「没有」Option:没有 null 怎么活
E0624🚨 别用 `.len()` 试 —— 你会撞到一个误导性的报错Option:没有 null 怎么活

章节