学习笔记

22、Derive macros(派生宏)

22、Derive macros(派生宏)

Derive macros(派生宏) 上一节,我们为Ticket结构体实现了PartialEq这个trait,使其可以使用比较运算符(==、!=),但是,如果我们想要为大量的结构体实现这个比较基础的trait,那么我们可能要手动写大量的代码,可能重复性很高,导致代码又臭又长。 为了解决这个问题,Ru

CN059 CN059 2025-09-09
44 0 0
21、Operator overloading(运算符重载)

21、Operator overloading(运算符重载)

运算符重载 现在我们对于traits有了基本的了解,回到运算符重载上来。运算符重载就是对一些运算符(比如+,-,*,/,==,!=等)的行为进行自定义。 运算符是traits 在Rust里,运算符就是traits。 对于每一个运算符,都有相应的trait来定义这个运算符的行为。通过对我们自己的类型实

CN059 CN059 2025-09-09
34 0 0
20、Orphan Rule(孤儿规则)

20、Orphan Rule(孤儿规则)

孤儿规则 实现traits 你不能对另外的crate里面的类型定义新的方法,比如: impl u32 { fn is_even(&self) -> bool { self % 2 == 0 } } 编译器会报错 error[E0390]: cannot

CN059 CN059 2025-09-09
45 0 0
19、Traits(“接口”)

19、Traits(“接口”)

Traits 重新看之前的Ticket结构体 pub struct Ticket { title: String, description: String, status: String, } 之前我们所有的assertions(测试)都使用的是Ticket的字段。 ass

CN059 CN059 2025-09-09
39 0 0
18、Destructors(析构函数)

18、Destructors(析构函数)

Destructors(析构函数) 既然使用了堆,那么我们应该对这一块内存负责。C/C++中,我们需要手动调用free函数,清理不再使用的内存空间。Java,C#等语言,提供了GC来帮我们管理内存,但是会有性能损失。同样的,Rust的语言特性决定了他也要像C/C++那样,手动管理内存,这在编译时就要

CN059 CN059 2025-09-07
33 0 0
17、可变引用(练习)

17、可变引用(练习)

可变引用 在上一节的习题中,我们完成了这样的代码 impl Ticket { pub fn title(&self) -> &String { &self.title } pub fn description(&self

CN059 CN059 2025-09-07
36 0 0
16、Ownership System(所有权系统)

16、Ownership System(所有权系统)

Ownership System(所有权系统) 所有权系统是Rust语言最基础,最独特,最重要的机制,它让Rust无需GC(Garbage Collection 垃圾回收机制)就可以保障内存安全和运行效率。 所有权系统包括所有权(Ownership)、借用(Borrowing)、生命周期(Lifet

CN059 CN059 2025-09-06
38 0 0
15、Encapsulation(封装)

15、Encapsulation(封装)

Encapsulation(封装) 封装 既然我们已经对模块和可见性有了基本的了解,那么让我们回到封装上来。 封装是隐藏对象内部表示的做法。它最常用于强制实施对象状态的一些不变性(invariants)。 让我们回顾Ticket结构体 struct Ticket { title: Strin

CN059 CN059 2025-09-02
32 0 0
14、Visibility(可见性)

14、Visibility(可见性)

Visibility(可见性) 当你开始将代码分解成多个模块时,就需要开始考虑可见性问题。可见性决定了你的代码(或其他人的代码)中哪些区域可以访问给定的实体,无论是结构体、函数还是字段等。 默认私有 在 Rust 中,默认情况下一切都是私有的。 一个私有实体只能被访问于: 定义它的同一模块 其中一

CN059 CN059 2025-09-02
37 0 0
13、Modules(模块)

13、Modules(模块)

Modules(模块) 上一节,我们在new函数中单独写明对字符串的格式约束,但是存在一个问题。 pub fn new(title: String, description: String, status: String) -> Self { if status!="To-D

CN059 CN059 2025-09-02
27 0 0
1 5 6 7 8 9