You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中if与if let语句里临时对象的生命周期为何存在差异?

为什么Rust中Value(1)与Value(2)的生命周期存在差异?

这段Rust代码运行后,Value(1)会在打印one!前被销毁,而Value(2)要等two!打印完才销毁,和预期的“两个对象都在println前销毁”不符,核心原因是Rust对临时值的生命周期处理规则不同:

#![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!");
    };
}

1. 第一个if语句的情况

在if Value(1).0 == 1中,Value(1)是临时创建的结构体实例,我们只访问它的字段.0做相等比较。当这个比较表达式求值完成后,该临时结构体没有任何后续引用或使用场景,Rust会立即销毁它,所以Dropping Value(1)会在println!("one!")之前打印。

2. 第二个if let语句的情况

if let _ = Value(2).0属于模式匹配语法。这里Rust会把Value(2)这个临时实例绑定到模式对应的位置——哪怕用_忽略了绑定变量,这个临时值的生命周期也会被延长到整个if let代码块结束。因为模式匹配需要持有原对象完成匹配逻辑(即使是通配符_),所以Value(2)会存活到println!("two!")执行完毕,之后才被销毁。

内容的提问来源于stack exchange,提问作者Simon Edlund

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:04:53