if let 语句中临时对象的生命周期

问题描述 投票:0回答:1

下面的代码中 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 lifetime-scoping
1个回答
1
投票

这是由于程序中范围的布局造成的。您可以在 Rust 参考(临时范围) 中看到与您类似的示例。

main
函数应该有五个作用域:

  1. 函数体;
  2. 第一个
    if
    的条件表达式范围;
  3. 第一个
    if
    的身体;
  4. 第二个
    if
    的条件表达式范围;
  5. 第二个
    if
    的身体。

对您的问题来说重要的是第 2 点和第 4 点。在评估

if
语句的条件时创建临时作用域。您的 Value 结构仅存在于这些临时范围中。当进入
if
的主体时,条件范围将弹出,其初始化变量将被删除。这就是为什么 Value 的 drop 方法在 if 语句中的
println!
指令之前执行。

© www.soinside.com 2019 - 2024. All rights reserved.