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
相关产品推荐
相关产品推荐

