下面的代码中 Value(1) 和 Value(2) 的生命周期为何不同?
#![allow(irrefutable_let_patterns)]
struct Value(i32);
impl Drop for Value {
fn drop(&mut self) {
println!("Dropping Value({})", self.0);
}
}
pub fn main() {
if Value(1).0 == 1 {
println!("one!");
};
if let _ = Value(2).0 {
println!("two!");
};
}
Value(1) 在“one!”之前被删除,而 Value(2) 在“two!”之后被删除
我希望在执行 println!("one!/two!") 语句之前删除这两个值。
这是由于程序中范围的布局造成的。您可以在 Rust 参考(临时范围) 中看到与您类似的示例。
main
函数应该有五个作用域:
if
的条件表达式范围;if
的身体;if
的条件表达式范围;if
的身体。对您的问题来说重要的是第 2 点和第 4 点。在评估
if
语句的条件时创建临时作用域。您的 Value 结构仅存在于这些临时范围中。当进入 if
的主体时,条件范围将弹出,其初始化变量将被删除。这就是为什么 Value 的 drop 方法在 if 语句中的 println!
指令之前执行。