rust-quiz:028-underscore-prefix.rs
题目
struct Guard;
impl Drop for Guard {
fn drop(&mut self) {
print!("1");
}
}
fn main() {
let _guard = Guard;
print!("3");
let _ = Guard;
print!("2");
}
关键
_
之前有一个类似的案例,这里的_
并不回收声明周期。
但是,这里需要重新明确的是- 以
_
作为首次声明,标识马上结束生命周期 - 以
_
开头的变量,声明不结束声明周期,后续_
声明结束声明周期 _
非首次声明,不立即结束声明周期
- 以
为了理解,我们举出如下例子
声明即结束
fn main() { let _ = Guard; print!("2"); }
打印
12
声明保留
fn main() { let _a = Guard; print!("3"); let a = Guard; print!("2"); }
第二次声明不是
_
,_a
不作为_
,不立即结束声明周期。
打印3211
声明传递
fn main() { let _a = Guard; print!("3"); let _ = Guard; print!("2"); }
首次
_a
引用,第二次_
声明结束声明周期,第二个_
最后drop
.
打印3121
就近影响
fn main() { let _a = Guard; print!("3"); let _b = Guard; print!("2"); let _ = Guard; print!("4"); }
打印
321411
。
这里只有_b
在_
声明时进行了drop
.
题解
这里看来,在_
声明的时候,_guard
会进行drop
。
根据上述原理,打印3121
答案
3121
本作品采用《CC 协议》,转载必须注明作者和本文链接