Drop νŠΈλ ˆμž‡

DropνŠΈλ ˆμž‡μ„ κ΅¬ν˜„ν•˜λ©΄, κ·Έ 값이 μŠ€μ½”ν”„ λ°–μœΌλ‘œ λ‚˜κ°ˆ λ•Œ 싀행될 μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

struct Droppable {
    name: &'static str,
}

impl Drop for Droppable {
    fn drop(&mut self) {
        println!("{} μ‚­μ œ 쀑", self.name);
    }
}

fn main() {
    let a = Droppable { name: "a" };
    {
        let b = Droppable { name: "b" };
        {
            let c = Droppable { name: "c" };
            let d = Droppable { name: "d" };
            println!("B λΈ”λ‘μ—μ„œ λ‚˜κ°€κΈ°");
        }
        println!("A λΈ”λ‘μ—μ„œ λ‚˜κ°€κΈ°");
    }
    drop(a);
    println!("mainμ—μ„œ λ‚˜κ°€κΈ°");
}
This slide should take about 8 minutes.
  • std::mem::drop은 std::ops::Drop::dropκ³Ό κ°™μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 값이 λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜λ©΄ μžλ™μœΌλ‘œ μ‚­μ œλ©λ‹ˆλ‹€.
  • 값이 μ‚­μ œλ  λ•Œ std::ops::Drop을 κ΅¬ν˜„ν•˜λ©΄ Drop::drop κ΅¬ν˜„μ΄ ν˜ΈμΆœλ©λ‹ˆλ‹€.
  • 그러면 Drop κ΅¬ν˜„ 여뢀와 관계없이 ν•΄λ‹Ή ν•„λ“œλ„ λͺ¨λ‘ μ‚­μ œλ©λ‹ˆλ‹€.
  • std::mem::drop은 값을 μ‚¬μš©ν•˜λŠ” 빈 ν•¨μˆ˜μž…λ‹ˆλ‹€. μ€‘μš”ν•œ 점은 κ°’μ˜ μ†Œμœ κΆŒμ„ κ°€μ§€λ―€λ‘œ λ²”μœ„ λμ—μ„œ μ‚­μ œλœλ‹€λŠ” μ μž…λ‹ˆλ‹€. λ”°λΌμ„œ λ²”μœ„λ₯Ό λ²—μ–΄λ‚  λ•Œλ³΄λ‹€ 빨리 값을 λͺ…μ‹œμ μœΌλ‘œ μ‚­μ œν•  수 μžˆλŠ” νŽΈλ¦¬ν•œ λ°©λ²•μž…λ‹ˆλ‹€.
    • μ΄λŠ” dropμ—μ„œ 잠금 ν•΄μ œ, 파일 λ‹«κΈ° λ“±μ˜ μž‘μ—…μ„ μ‹€ν–‰ν•˜λŠ” 객체에 μœ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ…Όμ˜μ :

  • Drop::drop은 μ™œ selfλ₯Ό 인자둜 λ°›μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?
    • 짧은 λŒ€λ‹΅: λ§Œμ•½ κ·Έλ ‡κ²Œ λœλ‹€λ©΄ std::mem::drop이 λΈ”λ‘μ˜ λμ—μ„œ 호좜되고, λ‹€μ‹œ Drop::drop을 ν˜ΈμΆœν•˜κ²Œ λ˜μ–΄, μŠ€νƒ μ˜€λ²„ν”Œλ‘œκ°€ λ°œμƒν•©λ‹ˆλ‹€!
  • drop(a)λ₯Ό a.drop()둜 λ³€κ²½ν•΄ λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€.