struct D(u8);
impl Drop for D {
fn drop(&mut self) {
print!("{}", self.0);
}
}
struct S {
d: D,
x: u8,
}
fn main() {
let S { x, .. } = S {
d: D(1),
x: 2,
};
print!("{}", x);
let S { ref x, .. } = S {
d: D(3),
x: 4,
};
print!("{}", x);
}
當物件生命週期結束之後,才會進行drop
。
額外的地方需要注意兩點
- 引用:如果存在引用,是不會進行
drop
的 - 轉移:當發生
move
的時候,可以看做老變數的移除,需要drop
最奇葩的
move
,不是值轉移,而是值唯一。
當二次進行宣告的時候,為了保證一個值就只有一個引用。
第二個值繫結會強制取消第一個值繫結,就會呼叫drop
。
這裡主要問題是在於,匹配的物件的生命週期。
對於第一個
let S { x, .. } = S {
d: D(1),
x: 2,
};
print!("{}", x);
因為作為值匹配,S
中的值,在匹配完成以後就move
了。
因此,這裡會對內部的變數進行drop
,執行D(1)
中的drop
,列印12
。
第二個
let S { ref x, .. } = S {
d: D(3),
x: 4,
};
print!("{}", x);
這裡主要是使用的是ref x
,實際上獲取的是一個引用,並沒有發生值的move
。
因此,原始的值隨時都可能繼續使用,只有在程式結束才進行drop
。
這裡會列印43
。
1243
本作品採用《CC 協議》,轉載必須註明作者和本文連結