Lifetimes in Rust
Background
高级语言很方便地处理我们代码中的每个对象的存活的范围(scope), 我们不需要理解这些对象的生命周期。Rust同样为我们管理着生命周期,我们可以通过所有权(ownership)和借用(borrowing)对简单情况进行更多的控制,但是对于复杂的情况,我们需要在代码中给出识别标识,以便编译器能够理解更大的生命周期的范围。
简单来说,一切的一切归根揭底就是为了在对象使用完之后释放它。
高级语言如Go、Ruby、Python等等,使用垃圾回收器在整个代码中扫描和标记对象,以查看它们是否准备好从内存中释放掉,并将对所有已标记可释放的对象执行释放操作。当你不再使用对象时,低级语言如C、汇编要求你手工释放它们。
Rust避免了垃圾回收和手写代码释放内存的成本,它根据代码库中每个对象的生命周期维护释放内存的时间。生存期主要由所有权系统决定(描述代码的哪个部分负责拥有内存中对象的系统),以及在复杂情况下,由帮助编译器而提供的手动生命周期描述符来决定。一旦对象的生命周期束,内存将立即释放。
Simple Lifetimes
- const
生命周期是整个程序,它的值可以内联到代码中的任何地方。 - static
生命周期也是整个程序,但它不会被内联,它存在于内存的固定位置。
大多数其他对象的生命周期只发生在块(block)的范围内,或者直到某个方法调用夺走了它们的所有权。如果一个对象要在方法调用中超出其使用范围而存在(意思是方法调用完还继续存活),那么该方法需要借用(borrow)它,或者复制(copy)它,以便在方法完成后,它的生命周期可以在外部作用域中继续长存。
Complex Lifetimes
有时候,当代码中没有足够的信息来确定生命周期时,Rust编译器会要求描述/注释生命周期。