学习rust_day17 Unsafe Rust Unsafe Rust:隐藏在安全背后的强大能力 Rust默认保证内存安全 Unsafe Rust不强制这些保证 用于更底层的系统编程或绕过编译器限制 Unsafe Rust的五个超能力 解引用裸/原始指针 调用不安全函数或方法 访问或修改可变静态变量 实现不安全的trait 访问union的字段 Unsafe≠不安全 borrow checker仍然工 2026-03-27
学习rust_day16 模式匹配 模式Pattern Rust中的特殊语法,用于匹配简单或复杂类型的结构 例如:与match耒表达式和其他构造结合,增强程序控制流程 模式的组成 字面值(Literals):例如数字或字符串 解构数据结构:数组、枚举、结构体、元组等 变量(Variables):命名的变量 通配符(Vildcards):_表示任意值 占位符(Placeholders):尚未具体定义的部分 使用方 2026-03-26
学习rust_day15 面向对象编程特性 隐藏实现细节的封装对象的实现细节不能被使用该对象的代码访问 pub关键字来决定我们代码中的哪些模块、类型、函数和方法应该是公共的 默认情况下其他所有内容都是私有的 继承作为类型系统和代码共享 继承是一种机制,通过它一个对象可以继承另一个对象定义中的元素,从而获得父对象的数据和行为,而无需再次定义它们 在不使用宏的情况下,没有办法定义一个继承父结构体的字段和方法实现的结构体 2026-03-25
学习rust_day14 Streams “消息传递”中异步的recv方法会随着时间产生一系列项目,这称为stream StreamExt Ext是Rust社区中使用另外一个trait扩展某个trait的常见模式 简单来说 Stream trait定义了一个低级接口,有效地结合了Iterator和Future traits StreamExt在Stream之上提供了一组更高级的APl,包括next方法以及类似于Itera 2026-03-24
学习rust_day13 异步编程 并行性Parallelism:同时执行多个操作 并发性Concurrency:在操作间进行切换 阻塞操作Blocking Operations:阻止程序继续执行直到操作完成 非阻塞操作Non-blocking Operations:允许程序在等待时执行其他任务 操作类型 CPU密集型(CPU-bound):受处理器能力限制(如视频导出) IO密集型O-bound):受输入/ 2026-03-22
学习rust_day12 引用循环可能导致内存泄漏 内存泄漏 永远不会被清理掉的内存 Rust的安全保障使得意外的内存泄漏很难发生,但不是不可能 完全防止内存泄漏并不是Rust的保证之一 一> 内存泄漏是内存安全的 例如:通过Rc和RefCell就可创建出循环引用,导致内存泄漏 各个项的引用数永不为0 例: 123456789101112131415161718192021222324252627282930 2026-03-21
学习rust_day11 Cargo WorkspacesWorkspace(工作空间)是一组共享同一个Cargo.lock文件和输出目录的包Vorkspace例子: 一个Binary crate: main 两个Library Crate: add_one add two 例: 在项目顶级文件夹下创建Cargo.toml: 12345[workspace]members = [ "adder&qu 2026-03-20
学习rust_day10 零成本抽象(zero-cost abstractions) 迭代器虽然是高级抽象,但在编译后,它们被转换成了与你手写低级代码几乎相同的代码。 迭代器是Rust的零成本抽象之一,这意味着使用这种抽象不会引入任何额外的运行时开销。 结论:在Rust中可放心使用迭代器和闭包等高级特性,它们提供了更高层次的代码抽象,同时保持着极高的运行时性能,不会带来性能损失。 自定义构建与发布配置 Cargo提供 2026-03-20
学习rust_day09 闭包 可以存储在变量中或作为参数传递给其他函数的匿名函数。 闭包中的捕获概念可以理解成从该闭包的上下文获得一些变量的信息以至于可以穿透函数定义的界限使用这些变量。 闭包的类型推断和注释 闭包通常不需要像n函数那样标注参数或返回值的类型 不会在暴露给用户的接口中使用 通常很短,只在有限的上下文中使用,以便编译器可推断其参数和返回值的类型 可以添加类型注释 闭包有点类似匿名函数。 例: 12345 2026-03-19
学习rust_day08 生命周期 当引用的生命周期可能以几种不同的方式相关联时,就必须标注生命周期了。 借用检查器Borrow Checker 确保数据存活的时间长于其引用(Outlive) 比较作用域,以确定所有的借用是否有效 例: 1234567891011121314151617181920212223242526272829//函数中的泛型生命周期fn main() { let string1 2026-03-17