Derive macros(派生宏) 上一节,我们为Ticket结构体实现了PartialEq这个trait,使其可以使用比较运算符(==、!=),但是,如果我们想要为大量的结构体实现这个比较基础的trait,那么我们可能要手动写大量的代码,可能重复性很高,导致代码又臭又长。 为了解决这个问题,Ru
运算符重载 现在我们对于traits有了基本的了解,回到运算符重载上来。运算符重载就是对一些运算符(比如+,-,*,/,==,!=等)的行为进行自定义。 运算符是traits 在Rust里,运算符就是traits。 对于每一个运算符,都有相应的trait来定义这个运算符的行为。通过对我们自己的类型实
孤儿规则 实现traits 你不能对另外的crate里面的类型定义新的方法,比如: impl u32 { fn is_even(&self) -> bool { self % 2 == 0 } } 编译器会报错 error[E0390]: cannot
Traits 重新看之前的Ticket结构体 pub struct Ticket { title: String, description: String, status: String, } 之前我们所有的assertions(测试)都使用的是Ticket的字段。 ass
Destructors(析构函数) 既然使用了堆,那么我们应该对这一块内存负责。C/C++中,我们需要手动调用free函数,清理不再使用的内存空间。Java,C#等语言,提供了GC来帮我们管理内存,但是会有性能损失。同样的,Rust的语言特性决定了他也要像C/C++那样,手动管理内存,这在编译时就要
可变引用 在上一节的习题中,我们完成了这样的代码 impl Ticket { pub fn title(&self) -> &String { &self.title } pub fn description(&self
Ownership System(所有权系统) 所有权系统是Rust语言最基础,最独特,最重要的机制,它让Rust无需GC(Garbage Collection 垃圾回收机制)就可以保障内存安全和运行效率。 所有权系统包括所有权(Ownership)、借用(Borrowing)、生命周期(Lifet
Encapsulation(封装) 封装 既然我们已经对模块和可见性有了基本的了解,那么让我们回到封装上来。 封装是隐藏对象内部表示的做法。它最常用于强制实施对象状态的一些不变性(invariants)。 让我们回顾Ticket结构体 struct Ticket { title: Strin
Visibility(可见性) 当你开始将代码分解成多个模块时,就需要开始考虑可见性问题。可见性决定了你的代码(或其他人的代码)中哪些区域可以访问给定的实体,无论是结构体、函数还是字段等。 默认私有 在 Rust 中,默认情况下一切都是私有的。 一个私有实体只能被访问于: 定义它的同一模块 其中一
Modules(模块) 上一节,我们在new函数中单独写明对字符串的格式约束,但是存在一个问题。 pub fn new(title: String, description: String, status: String) -> Self { if status!="To-D