rust-quiz:012-binding-drop-behavior.rs

godme發表於2022-07-11
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 協議》,轉載必須註明作者和本文連結

相關文章