rust-quiz:028-underscore-prefix.rs

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

相關文章