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 協議》,轉載必須註明作者和本文連結