Rust: Pin API์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ (RFC 2349)

์— ๋งŒ๋“  2018๋…„ 03์›” 18์ผ  ยท  211์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: rust-lang/rust

rust-lang / rfcs # 2349์— ๋Œ€ํ•œ ์ถ”์  ๋ฌธ์ œ

์ฐจ๋‹จ ์•ˆ์ •ํ™” :

  • [x] ๊ตฌํ˜„ (PR # 49058)
  • [] ๋ฌธ์„œ

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ :

  • [] !Unpin ๋ฐ์ดํ„ฐ ์œ ์ถœ์— ๋Œ€ํ•ด ๋” ๊ฐ•๋ ฅํ•œ ๋ณด์ฆ์„ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

ํŽธ์ง‘ : ์š”์•ฝ ์ฃผ์„ : https://github.com/rust-lang/rust/issues/49150#issuecomment -409939585 (๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆจ๊ฒจ์ง„ ๋ถ€๋ถ„์— ์žˆ์Œ)

B-RFC-approved C-tracking-issue T-lang T-libs

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@rfcbot ์šฐ๋ ค API ๋ฆฌํŒฉํ„ฐ๋ง

์•ฝ๊ฐ„์˜ ์˜๊ฐ์„๋ฐ›์€ ๊ตฌ์กฐ์ฒด์™€ ์–ด์ ฏ๋ฐค์— ์ €๋Š”์ด API๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ๋ชจ๋“  ๋‹จ์ผ ํฌ์ธํ„ฐ์˜ ๊ณ ์ • ๋œ ๋ฒ„์ „์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํฌ์ธํ„ฐ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” Pin ์œ ํ˜•์ด ํ•˜๋‚˜๋งŒ ์žˆ๋„๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ค ์‹ ์œผ๋กœ๋“  API์˜ ๊ทผ๋ณธ์ ์ธ ์žฌ๊ตฌ์„ฑ์€ ์•„๋‹ˆ์ง€๋งŒ "๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •"๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์กฐ๊ฐ์œผ๋กœ ๋Œ์–ด๋‚ด๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  211 ๋Œ“๊ธ€

์ด์ œ ์Šคํƒ ๊ณ ์ •์ด RFC์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. @withoutboats ๋Š”์ด๋ฅผ ์œ„ํ•ด ํฌ๋ ˆ์ดํŠธ๋ฅผ ์ถœ์‹œ ํ•  ๊ณ„ํš์ž…๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํ•„์š”ํ•œ ๋‚ด ํฌ๋ ˆ์ดํŠธ์— ๋ณต์‚ฌํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

@ Nemo157 ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ๋ณต์‚ฌํ•˜๊ณ  ๋‹น์‹ ์˜ ๊ฒฝํ—˜์„๋ณด๊ณ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!

Unpin ๋ฐ์ดํ„ฐ ์œ ์ถœ์— ๋Œ€ํ•œ ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์€ ์ด๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. @cramertj๊ฐ€ ์š”์ฒญ Unpin ๋ฐ์ดํ„ฐ๋ฅผ Pin ๋ฎ์–ด ์“ธ ์ˆ˜ ์—†๋‹ค๊ณ  ๋งํ•˜๋ฉด ํ•ด๋‹น API๋Š” ๋ถˆ๊ฑด์ „ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์ž‘๋™ํ•˜๋Š” ๋‹ค๋ฅธ ๋œ ์ธ์ฒด ๊ณตํ•™์  ์Šคํƒ ๊ณ ์ • API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ์„ ํƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ถˆ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ธ์ฒด ๊ณตํ•™์  ์Šคํƒ ๊ณ ์ • API๊ฐ€ ๋” ์œ ์šฉํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋ˆ„์ถœ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ณด์žฅ์ด ๋” ์œ ์šฉํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ฃผ๋ชฉํ•  ํ•œ ๊ฐ€์ง€๋Š” ๋ฃจํ”„์—์„œ ํด๋ง ํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— await! ๋งคํฌ๋กœ ๋‚ด๋ถ€์˜ Future::poll ์™€ ๊ฐ™์€ ๊ฒƒ์— ์Šคํƒ ๊ณ ์ •์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๊ทธ ๋ฌธ์ œ์— ๋ถ€๋”ชํžˆ๋ฉด ๊ด€์‹ฌ์ด ์žˆ๊ณ , ๋‹น์‹ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ• / ๋งŒ์•ฝ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ํ˜„์žฌ ์‚ฌ์šฉ์€ ์ง€์›์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ผ StableFuture ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ์‹คํ–‰ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋งค์šฐ ์‚ฌ์†Œ @cramertj ๊ฐ™์€ API๋กœ ์ „ํ™˜ํ•˜๋ฉด ์ œ์•ˆ ์ด์™€ ํ•จ๊ป˜ ๋ฒŒ๊ธˆ์„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ StableFuture ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋„๋ก์ด๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ถ๊ธˆํ–ˆ์ง€๋งŒ ์ ์–ด๋„ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

API๋กœ ์‹คํ—˜ ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. Future ์˜ ๋‹ค์Œ (RFC์—์„œ ์ œ์•ˆ) ์ •์˜๊ฐ€ ๋” ์ด์ƒ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

trait Future {
    type Item;
    type Error;

    fn poll(self: Pin<Self>, cx: &mut task::Context) -> Poll<Self::Item, Self::Error>;
}

์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ. arbitrary_self_types ๊ฐœ์ฒด ์•ˆ์ „์„์œ„ํ•œ ๊ณ„ํš์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

ํ•œ ๊ฐ€์ง€ ์ฃผ๋ชฉํ•  ์ ์€ ์Šคํƒ ๊ณ ์ •์ด Future :: poll in the await์™€ ๊ฐ™์€ ๊ฒƒ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๋งคํฌ๋กœ๋Š” ๋ฃจํ”„์—์„œ ํด๋ง ํ•  ์ˆ˜ ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

@RalfJung ๋‹น์‹ ์€ ํ•„์š” Pin ์ง€์›๊ณผ ๊ฐ™์ด reborrows Pin ๊ฐ€ ํ˜„์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@cramertj ์Šคํƒ ๊ณ ์ • API๊ฐ€ ์•„๋‹Œ Pin API์˜ ์ œํ•œ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋‚˜์š”?

@RalfJung ๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ PinBox ๋Š” Pin ๋กœ ์žฌ์ฐจ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์Šคํƒ ๊ณ ์ • ์œ ํ˜•์€ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ( Pin ๋กœ ๋นŒ๋ฆฌ๋Š” ํ•˜๋‚˜๋Š” ์Šคํƒ ์œ ํ˜•์˜ ์ „์ฒด ์ˆ˜๋ช… ๋™์•ˆ ๋นŒ๋ฆผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค).

Pin ์ฃผ์–ด์ง€๋ฉด &mut Pin ๋กœ ๋นŒ๋ฆฐ ๋‹ค์Œ Pin::borrow ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์žฌ ์ฐจ์ž…์˜ ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋งํ•˜๋Š” ์ข…๋ฅ˜์˜ reborowing์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?

๊ฐ™์€ @RalfJung ๋ง์•„์š” - ๋ฐฉ๋ฒ• Future::poll ์ทจํ•  ๊ณ„ํš๋˜์—ˆ๋‹ค self: Pin<Self> ๋ณด๋‹ค๋Š”๋ฅผ, self: &mut Pin<Self> ์œ ํšจํ•˜์ง€ ์•Š์€ ( self 'ISN ๊ทธ๊ฒƒ ๋•Œ๋ฌธ์— ์œ ํ˜• t Deref<item = Self> - Deref<Item = Pin<Self>> ).

์‹ค์ œ๋กœ Pin::borrow ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@cramertj ๋‚˜๋Š” poll ์— x: &mut Pin<Self> poll ์— ์ „ํ™”ํ•˜๋„๋ก ์ œ์•ˆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค; x.borrow().poll() .

@RalfJung ์˜ค,

๋‹ค์Œ ์ฃผ์— Pin s๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์˜ ์˜ˆ๋ฅผ ๊ฒŒ์‹œํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ๊ธฐ์–ตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์žฌ ์ฐจ์ž…์ด ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. futures::io::AsyncRead ํŠน์„ฑ์˜ ๊ณ ์ • ๋œ ๋ฒ„์ „๊ณผ fn read_exact<'a, 'b, R: PinRead + 'a>(read: Pin<'a, R>, buf: &'b [u8]) -> impl StableFuture + 'a + 'b ์™€ ๊ฐ™์€ ์ž‘๋™ํ•˜๋Š” ์–ด๋Œ‘ํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉฐ์ด ํŠน์„ฑ์„ ๋งจ ์œ„์— ๊ณ ์ • ๋œ ์ƒ๋Œ€์ ์œผ๋กœ ๋ณต์žกํ•œ StableFuture ๋กœ ์ž‘์—… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜ํ‰.

๋‹ค์Œ์€ ๋‚ด๊ฐ€ ์ฝ๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์ „์ฒด ์˜ˆ์ž…๋‹ˆ๋‹ค.

pub trait Read {
    type Error;

    fn poll_read(
        self: Pin<Self>,
        cx: &mut task::Context,
        buf: &mut [u8],
    ) -> Poll<usize, Self::Error>;
}

pub fn read_exact<'a, 'b: 'a, R: Read + 'a>(
    mut this: Pin<'a, R>,
    buf: &'b mut [u8],
) -> impl StableFuture<Item = (), Error = Error<R::Error>>
         + Captures<'a>
         + Captures<'b> {
    async_block_pinned! {
        let mut position = 0;
        while position < buf.len() {
            let amount = await!(poll_fn(|cx| {
                Pin::borrow(&mut this).poll_read(cx, &mut buf[position..])
            }))?;
            position += amount;
            if amount == 0 {
                Err(Error::UnexpectedEof)?;
            }
        }
        Ok(())
    }
}

Pin ๋กœ ๋ชจ๋“  ๊ณณ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•  ๋•Œ๋งˆ๋‹ค Pin::borrow ์‚ฌ์šฉํ•ด์•ผํ•˜๋ฏ€๋กœ ์•ฝ๊ฐ„ ์งœ์ฆ์ด๋‚ฉ๋‹ˆ๋‹ค.

#[async]
fn foo<'a, R>(source: Pin<'a, R>) -> Result<!, Error> where R: Read + 'a {
    loop {
        let mut buffer = [0; 8];
        await!(read_exact(Pin::borrow(&mut source), &mut buffer[..]));
        // do something with buffer
    }
}

๋ฐฉ๊ธˆ impl<'a, R> Read for Pin<'a R> where R: Read + 'a ๊ฐ’์„ Pin<'a, R> ๋ชจ๋“  ๊ณณ์—์„œ ์ „๋‹ฌํ•ด์•ผํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด impl<'a, R> Read for Pin<'a R> where R: Read + 'a ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  fn foo<R>(source: R) where R: Read + Unpin ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ Pin<'a, R>: !Unpin ๋•Œ๋ฌธ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ํ•€ ์ž์ฒด๋Š” ์ฐธ์กฐ ์ผ ๋ฟ์ด๊ณ  ๊ทธ ๋’ค์—์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ์—ฌ์ „ํžˆ ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ unsafe impl<'a, T> Unpin for Pin<'a, T> {} ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ ค ์‚ฌํ•ญ : libstd์˜ ๋Œ€๋ถ€๋ถ„์˜ ์œ ํ˜•์ด Unpin ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ Pin ๊ฐ€ ์•„๋‹ˆ๋”๋ผ๋„ ๋ฌด์กฐ๊ฑด Unpin ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ Vec , VecDeque , Box , Cell , RefCell , Mutex , RwLock , Rc , Arc . ๋Œ€๋ถ€๋ถ„์˜ ์ƒ์ž๋Š” ๊ณ ์ •์— ๋Œ€ํ•ด ์ „ํ˜€ ์ƒ๊ฐํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ชจ๋“  ํ•„๋“œ๊ฐ€ Unpin ๊ฒฝ์šฐ ์œ ํ˜•์ด Unpin Unpin ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฑด์ „ํ•œ ์„ ํƒ์ด์ง€๋งŒ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์•ฝํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค.

๋ชจ๋“  libstd ํฌ์ธํ„ฐ ์œ ํ˜• (์•„๋งˆ๋„ ์›์‹œ ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜๋„ ์žˆ์Œ) ๋ฐ UnsafeCell ๋Œ€ํ•ด Unpin ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์ด ๋ฌธ์ œ๊ฐ€ ์ €์ ˆ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ์ผ์ž…๋‹ˆ๊นŒ?

๋ชจ๋“  libstd ํฌ์ธํ„ฐ ์œ ํ˜• (์•„๋งˆ๋„ ์›์‹œ ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จ ํ•  ์ˆ˜๋„ ์žˆ์Œ) ๋ฐ UnsafeCell์— ๋Œ€ํ•ด Unpin์„ ๊ตฌํ˜„ํ•˜๋ฉด์ด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ์ผ์ž…๋‹ˆ๊นŒ?

๋„ค, ์ €์—๊ฒŒ๋Š” Send ์™€ ๊ฐ™์€ ์ƒํ™ฉ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์งˆ๋ฌธ์ด ๋ฐฉ๊ธˆ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. Pin ๋ฐ PinBox Send ์–ธ์ œ์ž…๋‹ˆ๊นŒ? ์ง€๊ธˆ, ์ž๋™ ํŠน์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๊ทธ๋“ค์—๊ฒŒ ์ˆ˜ Send ํ•  ๋•Œ๋งˆ๋‹ค T ์žˆ๋‹ค Send . ๊ทธ๋ ‡๊ฒŒ ํ•  ์„ ํ—˜์  ์ธ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ์œ ํ˜• ์ƒํƒœ์˜ ์œ ํ˜•์ด ์ „์†ก ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•œ ์ž์ฒด ๋งˆ์ปค ํŠธ๋ ˆ์ด ํŠธ ( Sync ๋ผ๊ณ  ํ•จ)๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Pin<T> ์ด Send ์ธ ๊ฒฝ์šฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋งˆ์ปค ํŠธ๋ ˆ์ด ํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ : PinSend . ์›์น™์ ์œผ๋กœ Send ์•„๋‹Œ PinSend ํ•˜๊ฑฐ๋‚˜ ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@RalfJung Pin ๋Š” &mut T ๊ฐ€ Send PinBox ๋Š” Box<T> ๊ฐ€ Send ์ผ ๋•Œ Send์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๋“ค์ด ๋‹ค๋ฅผ ์ด์œ ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์Œ, ์ผ๋ถ€ ์œ ํ˜•์ด Send ์ด์ง€๋งŒ Sync ์•„๋‹Œ ๊ฒƒ์ฒ˜๋Ÿผ "์ด ๋ฉ”์„œ๋“œ๊ฐ€ Pin<Self> ๋กœ ํ˜ธ์ถœ๋˜๋ฉด ์ ˆ๋Œ€ ์ด๋™๋˜์ง€ ์•Š์Œ์— ์˜์กด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋กœ ". ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๊ฒƒ์€ ์ฒ˜์Œ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ•œ ์Šค๋ ˆ๋“œ์— ๋‚จ์•„ ์žˆ์–ด์•ผํ•˜๋Š” ์„ ๋ฌผ์„ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ด๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ณ ์ • ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌ). ์„ค๋“๋ ฅ์žˆ๋Š” ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด ๋‚ผ ์ˆ˜ ์žˆ์„์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ๊ฒƒ์ผ๊นŒ ์š”?

๋ฐฉ๊ธˆ @Diggsey๊ฐ€ ์–ธ๊ธ‰ ํ•œ ํ‰์ƒ ๋ฌธ์ œ์— ๋ถ€๋”ช ํ˜”์Šต๋‹ˆ๋‹ค . Pin<Option<T>> -> Option<Pin<T>> ์€ ์•ˆ์ „ํ•œ ์ž‘์—…์ด์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ˜„์žฌ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜์—†๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.์ด ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์ข…๋ฅ˜์˜ API๊ฐ€ ํ•„์š”ํ•œ์ง€๋Š” ๋งํ•  ๊ฒƒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

trait OptionAsPin<T> {
    fn as_pin<'a>(self: Pin<'a, Self>) -> Option<Pin<'a, T>>;
}

impl<T> OptionAsPin<T> for Option<T> {
    fn as_pin<'a>(self: Pin<'a, Self>) -> Option<Pin<'a, T>> {
        match *unsafe { Pin::get_mut(&mut self) } {
            Some(ref mut item) => Some(unsafe { Pin::new_unchecked(item) }),
            None => None,
        }
    }
}

(ํŠธ๋žœ์Šค ๋ฎคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋ช…์„ ์—ฐ์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ๋„ˆ๋ฌด ๋ฉ์ฒญํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค).

ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ์งˆ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ๊ณ ์ • ์ฐธ์กฐ ์œ ํ˜•์„ ๋‹ค์‹œ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋Œ€๋‹ต์€ '์˜ˆ'๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ ์€ ํ† ๋ก ๊ณผ ํ•จ๊ป˜์ด

๋‚˜๋Š” ๋ฐฉ๊ธˆ Futures 0.2๊ฐ€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋งŒ ํผ ์ตœ์ข…์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ฝ์—ˆ์œผ๋ฏ€๋กœ ๊ฒฐ๊ตญ Pin ๋‹ค์‹œ PinMut ๋กœ ๋ฐ”๊พธ๊ณ  ๊ณต์œ  ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@RalfJung ๊ท€ํ•˜๊ฐ€ ์ œ์•ˆํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๊ท€ํ•˜์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์„ ๋”์šฑ ์ฒ ์ €ํžˆ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ Pin ๋ณ€ํ˜•์— ๋Œ€ํ•œ ์ž ์žฌ์ ์œผ๋กœ ๋งค๋ ฅ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฐพ์•˜๋‹ค ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ Deref ๋ฐ &Pin<T> <=> &&T ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. Pin<T> ๋ฅผ &T ์•ˆ์ „ํ•˜๊ฒŒ ์บ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ๋”๋ผ๋„ &T ๋Š” Pin<T> ๋กœ ์บ์ŠคํŠธ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋™๋“ฑํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ๋ณ€ํ™˜์„ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ์ด์œ ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค (์•ˆ์ „ํ•œ Deref impl ์ œ๊ฑฐ).

ํ˜„์žฌ map ์— ๋ฐฉ๋ฒ• Pin ์„œ๋ช…์„ ๊ฐ€์ง€๊ณ 

pub unsafe fn map<U, F>(this: &'b mut Pin<'a, T>, f: F) -> Pin<'b, U>

๋‹ค์Œ์ด ์•„๋‹Œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

pub unsafe fn map<U, F>(this: Pin<'a, T>, f: F) -> Pin<'a, U>

์•ฝ์ž๋กœ, ๋‚˜๋Š” ๋ณ€ํ™˜ ํ•  ์ˆ˜ Pin A๋ฅผ ํ•œ ์ข…๋ฅ˜์˜ Pin ๋ถˆํ•„์š” ์ˆ˜๋ช…์„ ๋‹จ์ถ•ํ•˜์ง€ ์•Š๊ณ  ํ•„๋“œ ์ค‘ ํ•˜๋‚˜.

map ๋ฉ”์„œ๋“œ์˜ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๊ตฌ์กฐ์ฒด์˜ Pin ๋ฅผ ๊ตฌ์กฐ์ฒด์˜ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ•„๋“œ ์ธ ๋‘ ๊ฐœ์˜ Pin ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•ด ๋ณด์ธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ ๋‹ฌ์„ฑํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

macro_rules! pin_fields {
    ($pin:expr, ($($field:ident),+ $(,)?)) => {
        unsafe {
            let s = Pin::get_mut(&mut $pin);
            ($(Pin::new_unchecked(&mut s.$field),)+)
        }
    };
}

Pin ๋Œ€ํ•œ ๋งŽ์€ ๋…ผ์˜์—์„œ ๊ฐœ์ธ ํ•„๋“œ์— ํ•€์„ "ํˆฌ์˜"ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฐ€์ •์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด map ์˜ ๋ฌธ์„œ ์ฃผ์„์€ ํ˜„์žฌ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ธ์ˆ˜ ๊ฐ’์ด ์ด๋™ํ•˜์ง€ ์•Š๋Š” ํ•œ (์˜ˆ : ํ•ด๋‹น ๊ฐ’์˜ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์—) ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ˆ˜์‹  ํ•œ ์ธ์ˆ˜์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ถ€ ๊ธฐ๋Šฅ.

"๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์ธ์ˆ˜ ๊ฐ’์ด ์ด๋™ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค"๋Š” ๋ณด์žฅ์€ map ์˜ ํ˜ธ์ถœ์ž๊ฐ€ ์œ ์ง€ํ•ด์•ผํ•˜๋Š” ๊ณ„์•ฝ์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ๊ด„ํ˜ธ "(์˜ˆ๋ฅผ ๋“ค์–ด, ํ•ด๋‹น ๊ฐ’์˜ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์ด๊ธฐ ๋•Œ๋ฌธ์—)"๋Š” ์ž์‹ ์˜ ๋น„๊ณต๊ฐœ ํ•„๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•œ ์•ˆ์ „ํ•จ์„ ๋ณด์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Drop ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค. Drop impl์€ ๋‹ค๋ฅธ ์ฝ”๋“œ์—์„œ ์ด๋ฏธ Pin<Self> ๋ณธ ๊ฒฝ์šฐ์—๋„ &mut self ๋ณด๊ฒŒ๋ฉ๋‹ˆ๋‹ค. mem::replace ๋˜๋Š” mem::swap ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ ๋ฐ–์œผ๋กœ ์ด๋™ํ•˜์—ฌ map ์˜ ์ด์ „ "์˜ฌ๋ฐ”๋ฅธ"์‚ฌ์šฉ์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง„ ์•ฝ์†์„ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, Pin::map ๋Œ€ํ•œ "์˜ฌ๋ฐ”๋ฅธ ํ•€ ํ”„๋กœ์ ์…˜"ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜๋ฉด unsafe ์˜ ๋‹ค๋ฅธ ํ˜ธ์ถœ์—†์ด Pin::map (ํ˜ธ์ถœ์€ unsafe { Pin::map(&mut self, |x| &mut x.p) } ์™€ ์œ ์‚ฌ ํ•จ)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ–‰๋™. ์ด๊ฒƒ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋†€์ดํ„ฐ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ˜„์žฌ API์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pin::map ์ด ์ด๋ฏธ์žˆ๋Š” unsafe ๋กœ ํ‘œ์‹œ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฏธ๋ž˜๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ˆ˜๋กœ์ด ๋ฌธ์ œ์— ๊ฑธ๋ ค ๋„˜์–ด ์งˆ ์œ„ํ—˜์ด ๋งŽ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Drop impl์—์„œ ์ž์‹ ์˜ ๋ถ„์•ผ์—์„œ ๋ฒ—์–ด๋‚˜๊ธฐ ์œ„ํ•ด ์ •๋ง ์ž์‹ ์˜ ๊ธธ์—์„œ ๋ฒ—์–ด๋‚˜์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  ์‹ถ์€ ์‹ค์งˆ์ ์ธ ์ด์œ ๊ฐ€ ๋งŽ์ง€ ์•Š์„๊นŒ.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” map ๋Œ€ํ•œ ๋ฌธ์„œ ์ฃผ์„์ด ์ด๊ฒƒ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, RFC ๋ฐ ์ฃผ๋ณ€ ํ† ๋ก ์—์„œ ๋ณผ ์ˆ˜์žˆ๋Š” ํ™•์žฅ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋ฅผ ๋ฌดํšจํ™”ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • ๋งคํฌ๋กœ๊ฐ€ ์•ˆ / ๊ทธ "ํ•€ ํˆฌ์‚ฌ"๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด์ด๊ฒŒ ์œ ๋„. ํ”„๋กœ์ ์…˜์€ ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์„ ๋‘˜๋Ÿฌ์‹ผ ๋‹ค๋ฅธ ์ฝ”๋“œ์— ๊ณ„์•ฝ์„ ๋ถ€๊ณผํ•˜๋ฏ€๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์™„์ „ํžˆ ์‹œํ–‰ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์™„๋ฃŒ ๋  ๋•Œ๋งˆ๋‹ค unsafe ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
  • RFC๋Š” Pin ๊ฐ€ &'a pin T ์–ธ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ๋ฐ”๋€Œ๋ฉด "ํ•„๋“œ๋ฅผ ํ†ตํ•ด ํˆฌ์˜ํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์†Œํ•œ"๊ฒƒ์ด๋ผ๊ณ  ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด ๊ฐœ์ธ ํ•„๋“œ๋ฅผ ํ”„๋กœ์ ์…˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ œํ•œ ๋˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ unsafe ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ ์ฃผ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

ํ•€์ด๋ผ๋„& T๋Š” ์•ˆ์ „ํ•˜๊ฒŒ & T๋กœ ์บ์ŠคํŠธ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค..

์‚ฌ์‹ค ๊ทธ๊ฒƒ์€ ์ถฉ๋ถ„ํ•œ ์กฐ๊ฑด์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด์ „ ๊ฒŒ์‹œ๋ฌผ ์—์„œ ๋‹ค์Œ ์ •์˜๋ฅผ ๋งŒ๋“ค์—ˆ ๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด ๋ชจ๋ธ์—์„œ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ •์˜ 5 : PinBox<T>.shr . ptr์ด T.shr('a, inner_ptr) ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ inner_ptr์— ๋Œ€ํ•œ ์ฝ๊ธฐ ์ „์šฉ ํฌ์ธํ„ฐ ์ธ ๊ฒฝ์šฐ ํฌ์ธํ„ฐ ptr ๋ฐ ์ˆ˜๋ช… 'a๋Š” PinBox<T> ์˜ ๊ณต์œ  ์œ ํ˜• ์ƒํƒœ๋ฅผ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

(๊ทธ๋ฆฌ๊ณ  ์•”์‹œ ์ ์œผ๋กœ Pin<'a, T>.shr ๋Œ€ํ•œ ํ•ด๋‹น ์ •์˜.)
PinBox<T>.shr ๊ฐ€ T.shr ์—๋งŒ ์˜์กดํ•˜๋Š” ๋ฐฉ์‹์— ์ฃผ๋ชฉํ•˜์„ธ์š”. ์ด ์ˆ˜ PinBox<T>.shr ์œผ๋กœ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋ถˆ๋ณ€์„ Box<T>.shr ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค, &Box<T> = &PinBox<T> . ์œ ์‚ฌํ•œ ์ถ”๋ก ์€ &&T = &Pin<T> ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋Š” RFC์— ์ž‘์„ฑ๋œ API ๋˜๋Š” ๊ณ„์•ฝ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์†Œ์œ , ๊ณต์œ , ๊ณ ์ •์˜ ์„ธ ๊ฐ€์ง€ ์œ ํ˜• ์ƒํƒœ ๋งŒ์žˆ๋Š” ๋ชจ๋ธ์˜ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. &&T = &Pin<T> ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋„ค ๋ฒˆ์งธ ์œ ํ˜• ์ƒํƒœ ์ธ "๊ณต์œ  ๊ณ ์ •"์„ ๋„์ž…ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

ํ•€์— ๋Œ€ํ•œ ๋งŽ์€ ๋…ผ์˜์—์„œ ํ•€์„ ๋น„๊ณต๊ฐœ ํ•„๋“œ์— "ํˆฌ์˜"ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฐ€์ •์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์•„์ฃผ ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค! ๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด Shenanigans ์˜ p ํ•„๋“œ๋ฅผ ๊ณต๊ฐœํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” do_something_that_needs_pinning ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ RFC์˜ ์˜๋„๋Š”์ด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ €๋Š” RFC๊ฐ€ ์™œ ๋น„๊ณต๊ฐœ ํ•„๋“œ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ธ๊ธ‰ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด ํ•ด์„์€ ํ•ญ์ƒ ๋ชจ๋“  ํ•„๋“œ์—์„œ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์—ˆ์Šต๋‹ˆ๋‹ค.)

์ด๊ฒƒ์ด ๋‚ด ๋ชจ๋ธ์—์„œ drop ์˜ drop(ptr) ์— T.pin(ptr) ์˜ ์ „์ œ ์กฐ๊ฑด์ด ์žˆ๋‹ค๊ณ  ์ผ์Šต๋‹ˆ๋‹ค. ์ด ํ•ด์„์„ ์‚ฌ์šฉํ•˜๋ฉด ์˜ˆ์ œ์˜ ์‹ค์ œ ์ฝ”๋“œ๋Š” drop ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค! ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ตญ ํ•„๋“œ ์•ˆ์ „ํ•œ ์ „๋ง์„ ํ—ˆ์šฉ ํ•  ๊ฒƒ ๊ฐ™์•„์š” (ํฌ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ด๋ฏธ์ด ํ†ต์ง€๋ฅผํ•˜์ง€ ์•Š์•˜๋Š”์ง€ ์ง€๊ธˆ์€ ... ๊ถ๊ธˆ), ์šฐ๋ฆฌ๋Š” ์ •๋ง ์ œ๊ณตํ•˜์ง€ ์•Š์•„์•ผ drop ๊ณผ &mut ์œ ํ˜•์ด ๊ณ ์ •๋˜๋Š” ๊ฒฝ์šฐ

์šฐ๋ฆฌ๋Š” ํ•˜๋‚˜์˜ (a) ๋งŒ๋“ค ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด impl Drop ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์œ ํ˜• ์ธ ๊ฒฝ์šฐ !Unpin , ๋˜๋Š” (b)์— ์ž์‚ฌ์˜ ์„œ๋ช…์„ ๋ณ€๊ฒฝ drop(self: Pin<Self>) ์˜ ๊ฒฝ์šฐ T: !Unpin ? ๋‘˜ ๋‹ค ๊ทน๋„๋กœ ์–ต์ง€๋กœ ๋“ค๋ฆฌ์ง€๋งŒ ๋ฐ˜๋ฉด์— ๋‘˜ ๋‹ค Drop::drop ๋ฅผ ํ•ญ์ƒ Pin<Self> ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด;) ๋ฌผ๋ก ์ด ์‹œ์ ์—์„œ ์ด๊ฒƒ์€ ๋” ์ด์ƒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์šฉ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ์Šฌํ”ˆ ๋ถ€๋ถ„์€ ์šฐ๋ฆฌ๊ฐ€์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์•ˆ์ •๋˜๋ฉด ๊ฒฐ์ฝ” ์•ˆ์ „ํ•œ ํ˜„์žฅ ํˆฌ์˜์„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@RalfJung ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์‹ค์šฉ์ ์ธ ์งˆ๋ฌธ์— ๋” ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์•„๋งˆ ๊ธฐ๋Œ€ํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ : wink :). ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

  • Pin<T: !Unpin> Deref<Target =T> ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
  • Pin<T> ๋ฐ PinMut<T> (์ „์ž๋Š” ๊ณต์œ  ํ•€)์ด ๋ชจ๋‘ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์— ๋ถ€์ •์ ์œผ๋กœ ๋Œ€๋‹ต ํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‘ ๋ฒˆ์งธ ์งˆ๋ฌธ์„ ๋‹ค์‹œ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค ์ƒ๊ฐ; ๋‚˜๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ํ•€์œผ๋กœ ๋Œ์•„๊ฐ€๊ณ  ์‹ถ๋‹ค (๊ทธ๋Ÿฌ๋‚˜ ์™„์ „ํžˆ ํ™•์‹ ํ•˜์ง€๋Š” ๋ชปํ•จ). ์ด๊ฒƒ์„ ์–ธ์–ด ์ˆ˜์ค€ ์ฐธ์กฐ ์œ ํ˜•์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋ฉด &pin T ๋ฐ &pin mut T ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ํ•˜๋“  ๋ชจ๋ธ์€ API ๋ถˆ๋ณ€์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋„ค ๋ฒˆ์งธ ์œ ํ˜• ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. &&T ๋ฅผ &Pin<T> ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ์‹ค์šฉ์ ์ธ ์งˆ๋ฌธ์— ๋” ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์•„๋งˆ ์œ™ํฌ๋ฅผ ๊ธฐ๋Œ€ ํ•˜๊ฒ ์ง€๋งŒ).

๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€. ;) ๊ทธ๋Ÿฌ๋‚˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๊ทธ๋ฆผ์— ๋“ค์–ด ์˜ค๋ฉด Pin ์ฃผ๋ณ€์—์„œ ๋ณด์žฅ๋˜๋Š” ๊ฒƒ๊ณผ ๋ณด์žฅ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์ตœ์†Œํ•œ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. Basic Rust๋Š”์ด๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๋…„ ๋™์•ˆ ์•ˆ์ •ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ช‡ ๋‹ฌ ๋™์•ˆ Pin ๋™์•ˆ ์ด๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Pin ๋Š” ๊ตฌ๋ฌธ์— ๊ด€ํ•œ ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์šฉ ์ถ”๊ฐ€์ด์ง€๋งŒ ๋ชจ๋ธ์— ๊ด€ํ•œ ํ•œ ์ค‘์š”ํ•œ ์ถ”๊ฐ€์ž…๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ฒ ์ €ํžˆ ๋ฌธ์„œํ™”ํ•˜๊ณ  Pin ์ฃผ์œ„์—์„œ ๊ฐ€์ •ํ•˜๊ฑฐ๋‚˜ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ˜„๋ช…ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์šฐ๋ ค๋Š” ํ˜„์žฌ ์ด๋ก ์ ์ด์ง€๋งŒ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋กœ ์ธํ•ด ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฐ€์ •์„ ๋งŒ๋“ค์–ด ์ฒซ ๋ฒˆ์งธ ๋ถˆ๊ฑด์ „ ํ•จ์ด ๋ฐœ์ƒํ•˜๋ฉด ๊ฐ‘์ž๊ธฐ ๋งค์šฐ ์‹ค์šฉ์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋‘ ๋ฒˆ์งธ ์งˆ๋ฌธ์— ๋Œ€ํ•ด :

์šฐ๋ฆฌ๊ฐ€ ๋ฌด์—‡์„ํ•˜๋“  ๋ชจ๋ธ์€ API ๋ถˆ๋ณ€์„ ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋„ค ๋ฒˆ์งธ ์œ ํ˜• ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. && T๋ฅผ & Pin์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๊ธฐ๋Œ€ํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ณด์ˆ˜์  ์‹ถ์€ ๊ฒฝ์šฐ์—, ์šฐ๋ฆฌ๋Š” ์ด๋ฆ„์„ ๋ฐ”๊ฟ€ ์ˆ˜ Pin ์— PinMut ๊ทธ๋Ÿฌ๋‚˜ ์ถ”๊ฐ€ํ•˜์ง€ PinShr (๊ฐ€๋Šฅ์„ฑ์ด ํ˜ธ์ถœ ํ•  ์ˆ˜ Pin ํ•˜์ง€๋งŒ ๋‚œ ์—ฌ๊ธฐ์— ๋ช…ํ™•ํ•˜๊ฒŒํ•˜๋ ค๊ณ  ) ์ง€๊ธˆ, ๊ทธ๋ฆฌ๊ณ  ์„ ์–ธ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•  ์ˆ˜ &PinMut<T> ๋ญ”๊ฐ€๋ฅผ ์‹ค์ œ๋กœ ํฌ์ธํŠธ๋ฅผ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜์ค‘์— ๊ณต์œ  ๊ณ ์ • ์ฐธ์กฐ๋กœ Pin ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@comex ๊ฐ€ PinShr ๋ฅผ ๊ฐ–๋Š” ์‹ค์งˆ์ ์ธ ์ด์œ ๋ฅผ ์ œ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. PinShr<'a, Struct> ์—์„œ PinShr<'a, Field> ๊นŒ์ง€์˜ getter๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ณต์œ  ํ•€์— &PinMut ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋Ÿฐ ๊ฒŒํ„ฐ๊ฐ€ ์–ผ๋งˆ๋‚˜ ํ•„์š”ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.


์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์—๋Š” (a) ๊ฐ์ฒด ์•ˆ์ „ ์ž„์˜์˜ ์ž์ฒด ์œ ํ˜•์— ๋Œ€ํ•œ ํ˜„์žฌ ๊ณ„ํš, (b) ๊ณต์œ  ์ฐธ์กฐ์—์„œ ๊ธฐ์กด API๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. PinShr (๋˜๋Š” PinMut ).

&mut ๋ฐ PinMut ๋ชจ๋‘์—์„œ ์ž‘๋™ ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์„ ์œ ์‚ฌํ•˜๊ฒŒ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. &mut ์—์„œ ์ž‘์—…ํ•˜๋Š” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ mem::swap ์„ (๋ฅผ) ์‚ฌ์šฉํ•  ์˜๋„๊ฐ€์—†๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. (๋‚ด๊ฐ€๋ณด๊ธฐ์— ์ด๊ฒƒ์€ !DynSized ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ์†”๋ฃจ์…˜์˜ ์ฃผ์š” ์ด์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. &mut ๋Š” ๊ณ ์ •๋˜๊ฑฐ๋‚˜ ๊ณ ์ •๋˜์ง€ ์•Š์„ ์ˆ˜์žˆ๋Š” ์ฐธ์กฐ ์œ ํ˜•์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค. Pin API์˜ ๋˜ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์œผ๋กœ ์ด๊ฒƒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ๋ชจ๋“  &mut ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋‹ค์†Œ ๋ฌด์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.)

&T ๋ฐ PinMut<T> ๋‘˜ ๋‹ค์— ๋Œ€ํ•ด "ํฅ๋ฏธ๋กœ์šด"์ผ์„ํ•˜๋ ค๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฐ€๋ฒผ์šด ์ฃผ์žฅ์ด ํ•˜๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ ๋งค์šฐ ์กฐ์‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์œ ๋ฆฌํ•œ ์ข‹์€ ์ฃผ์žฅ์„ ๋Šฅ๊ฐ€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ (์˜ˆ : impl Deref ), PinShr<'a, T> ์—๋Š” &'a T (์ˆ˜๋ช… ์œ ์ง€)๋กœ ๋ฐ”๊พธ๋Š” ์•ˆ์ „ํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค : @MicahChalmer ๊ฐ€ ์œ„์—์„œ ์•Œ์•„ ์ฐจ๋ฆฐ ๊ฒƒ์— Pin::map ๋ฐ / ๋˜๋Š” drop ์— ๋Œ€ํ•œ ๊ทœ์น™ . ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ณต๊ฐœ ํ•„๋“œ์— ๋Œ€ํ•œ ํ”„๋กœ์ ์…˜๊ณผ ํ•จ๊ป˜ Pin::map ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์„ ์–ธํ•˜์‹ญ์‹œ์˜ค (๋น„ ์ฐธ์กฐ ์—†์Œ, ์•”์‹œ ์ ์ด ์ง€ ์•Š์Œ). ์ด๊ฒƒ์€ ํ˜„์žฌ RFC์— ๋Œ€ํ•œ ๋‚˜์˜ ํ•ด์„์ž…๋‹ˆ๋‹ค. ์ด๋Š” &mut ๋ฐ & ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Drop ์ฃผ์œ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ œ๋Œ€๋กœ ๊ตฌ์„ฑ๋œ !Unpin ์œ ํ˜•์ด ์ฃผ์–ด์ง€๋ฉด UB๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Drop ์ฃผ์œ„์—์„œ ์žฌ๋ฏธ์žˆ๋Š” ์ผ์„ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Pin::map ์— ๊ณต๊ณต ์žฅ์†Œ์— ์‚ฌ์šฉํ•ด๋„ ๋ถˆ๊ฑด์ „ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ํฐ ๊ฒฝ๊ณ ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. &pin T ๊ฐ€ ์žˆ๋”๋ผ๋„์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•œ ์ฝ”๋“œ์˜ ํ•„๋“œ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์— ๋Œ€ํ•œ ์œ ์ผํ•œ ๊ฐ€๋Šฅํ•œ ์ฃผ์žฅ์€ ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์˜ต์…˜ ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ;) ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ ๋ฉด์—์„œ ์—ด๋“ฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด๋„ &pin ๋‹ค์†Œ ์ด์ƒํ•˜๊ณ  ๋น„์ธ๊ฐ„์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ํ’‹๊ฑด์ด๊ณ , ๊ตฌ์„ฑ ์„ฑ์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์˜ต์…˜์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์‚ฌ์†Œํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. Unpin ๋ฐ”์ธ๋”ฉ ๋œ Drop ์„ ์ถ”๊ฐ€ํ•˜๊ณ  DropPinned ๋ฐ”์ธ๋”ฉ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ drop ์†Œ์š” Pin<Self> . ์•„๋งˆ Unpin ์— ๋ฐ”์ธ๋”ฉ Drop ๋‹น์‹ ์ด ์“ธ ์ˆ˜์žˆ๋Š” ์ด์ƒํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹œํ–‰ ๋  ์ˆ˜ impl Drop for S ํ•˜์ง€๋งŒ,์ด ๊ฒฐํ•ฉ ์•”์‹œ ์ถ”๊ฐ€ S ์žˆ๋‹ค๋Š” ๋ง์„ Unpin ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ํ˜„์‹ค์ ์ด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. : / (์ด๊ฒƒ์€ ๋˜ํ•œ !DynSized ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋” ์ž˜ ์ž‘๋™ํ•˜๋Š” ์ง€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค- &mut T ๋ฅผ "๊ณ ์ • ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค"๋กœ ๋ฐ”๊พธ๊ณ  drop ์†Œ๋ฆฌ.)

@RalfJung @MicahChalmer Drop impl์—์„œ ํ•„๋“œ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ๋‹ค๋ฅธ ํ•„๋“œ์˜ ํ•€์— ํˆฌ์˜ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฑด์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ (์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ) !Unpin ์œ ํ˜•์˜ ํ•„๋“œ ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์ด๋ฏธ ์˜ค๋Š˜๋‚ ์˜ ๊ฒฝ์šฐ์ด๋ฉฐ ๋‹ค๋ฅธ ๊ณณ์—์„œ ํ•ด๋‹น ํ•„๋“œ์˜ ํ•€์— ํˆฌ์˜ํ•˜์ง€ ์•Š๋Š” ํ•œ ์•ˆ์ „ํ•˜๊ณ  ์ž˜ ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. . Drop ์™€์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ „์ถœ ๋ถ€๋ถ„์— ์•ˆ์ „ํ•œ ์ฝ”๋“œ ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Drop impl์— ๊ด€๊ณ„์—†์ด ํ•ด๋‹น ํ•„๋“œ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์•ˆ์ „ ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์„ ์ง€์ ํ•˜๊ธฐ ์œ„ํ•ด Pin::map ๋ฉ”๋ชจ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ฒฝ์šฐ์— ๋”ฐ๋ผ !Unpin ์œ ํ˜•์˜ ํ•„๋“œ ๋ฐ–์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๊ฐ€ ๋Œ์•„์˜ฌ ๋•Œ ํ•ด๋‹น ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์—์„œ ์ด๋™ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Drop impl์—์„œ ํ•„๋“œ๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ํ•ด๋‹น ํ•„๋“œ์˜ ํ•€์„ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ํˆฌ์˜ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฑด์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์œผ๋กœ, &pin ํ•„๋“œ์— ์˜๊ตฌ์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž‘์—…์„ ๋งŒ๋“œ๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์ด ์ž‘์€ ๋ณ€ํ™”๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•„๋“œ์—์„œ pub ์˜๋ฏธ๋ฅผ ๊ทผ๋ณธ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์„ ์‚ฌ์šฉํ•  ๋•Œ ๋“œ๋กญ impl์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•œ ๊ณ ์ • ์ฐธ์กฐ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Option ๊ฐ€ Drop ๊ฐ€ ์•„๋ฌด๊ฒƒ๋„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋ช…์‹œ ์ ์œผ๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š” ํ•œ Pin<Option<T>> ์—์„œ Option<Pin<T>> ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. " ์ด์ƒํ•œ". ์ปดํŒŒ์ผ๋Ÿฌ๋Š”์ด ๋ช…๋ น๋ฌธ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Option ๋Š”์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ match ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ž‘์—…์œผ๋กœ ์œ ์ง€๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Drop๊ณผ์˜ ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ์ด์‚ฌํ•˜๋Š” ๋ถ€๋ถ„์— ์•ˆ์ „ํ•œ ์ฝ”๋“œ ๋งŒ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์ž„์˜์˜ ๊ทœ์น™์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ˆ์ „ํ•œ ์ฝ”๋“œ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒ์„ฑ๊ธฐ๊ฐ€ ๋Œ์•„์˜ฌ ๋•Œ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์—์„œ ์ด๋™ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ์šฐ์— ๋”ฐ๋ผ! Unpin ์œ ํ˜•์˜ ํ•„๋“œ ๋ฐ–์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ํ•„๋“œ๋Š” Unpin ? ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํ•„๋“œ์˜ ์œ ํ˜•์ด Unpin ๊ฒฝ์šฐ ์™ธ๋ถ€ ๊ตฌ์กฐ์ฒด์˜ ๊ณต์šฉ ํ•„๋“œ์— ๋Œ€ํ•ด Pin::mut ๋ผ๋Š” ๊ทœ์น™์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์œ ์šฉํ•œ์ง€๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„์—†๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ์Šต๋‹ˆ๋‹ค.

&&T ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ณด์ฆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” &Pin<T> ์— ๋Œ€ํ•œ ํ˜ผ๋ž€์„ ์žฌ๋นจ๋ฆฌ ๋‹ค์‹œ ๋ง์”€ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. & , &mut ๋ฐ &pin ๊ฐ๊ฐ "๊ณต์œ  ์•ก์„ธ์Šค", "๊ณ ์œ  ์•ก์„ธ์Šค"๋ฐ "์ด๋™๋˜์ง€ ์•Š๋Š” ๊ฐ’์— ๋Œ€ํ•œ ๊ณ ์œ  ์•ก์„ธ์Šค"๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. &&pin ๋ฅผ "์ด๋™๋˜์ง€ ์•Š๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๊ณ ์œ  ์•ก์„ธ์Šค์— ๋Œ€ํ•œ ๊ณต์œ  ์•ก์„ธ์Šค"๋กœ ์ดํ•ดํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ณต์œ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ( &pin ์˜ ๊ณ ์œ ์„ฑ ๋ณด์žฅ์€ & ),ํ•˜์ง€๋งŒ ์œ ํ˜•์ด ์ด๋™๋˜์ง€ ์•Š๋Š” ์†์„ฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฌด์—‡์„ ์š”๊ตฌํ•˜๊ฑฐ๋‚˜ ๋งํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. "๊ณต์œ  ๊ณ ์ •"์ด ๊ทธ ์ž์ฒด๋กœ ๊ธฐ๋ณธ ๋ชจ๋“œ / ์œ ํ˜• ์ƒํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ํ—ท๊ฐˆ ๋ฆฌ ์‹œ๋‚˜์š”?

์š”์ ์€ "๊ณต์œ  ์•ก์„ธ์Šค"๋Š” ๋‚ด๊ฐ€ ์Šค์Šค๋กœ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Cell , RefCell ๋ฐ Mutex ๊ณต์œ ํ•˜๋Š” ๋งค์šฐ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๊ณต์œ ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋‹น์‹ ์ด ์†Œ์œ  ํ•œ ๊ฒƒ์„ ๊ณต์œ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  (์–ด๋–ค ๊ฒƒ์˜ "์œ ์ผ์„ฑ ๋ณด์žฅ์„ ์ทจ์†Œํ•˜๋Š”") ๊ทธ ์ง„์ˆ ์ด ์˜๋ฏธ๊ฐ€์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด๊ฒƒ์ด ํ˜ผ๋ž€์„ ์•ผ๊ธฐํ•˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . "์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ๊ณต์œ "๋˜๋Š” "๋™๊ธฐํ™” ๋œ๋กœ๋“œ / ์Šคํ† ์–ด๋ฅผ ํ†ตํ•œ ์›์ž ์  ์•ก์„ธ์Šค ๋งŒ ์ œ๊ณตํ•˜์—ฌ ๊ณต์œ "๋˜๋Š” "์ด ์ฐจ์šฉ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋ฐฐํฌ ํ•  ์•ก์„ธ์Šค ์ข…๋ฅ˜๋ฅผ ์กฐ์ •ํ•˜์—ฌ [๋‹จ ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ ๋‚ด์—์„œ] ๊ณต์œ "ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . RustBelt์˜ ํ•ต์‹ฌ ํฌ์ธํŠธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ชจ๋“  ์œ ํ˜•์ด ๊ณต์œ  ๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ผ์„ ์Šค์Šค๋กœ ์ •์˜ํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๊ณต์œ  ๋ฐ ๊ณ ์ •์˜ ์ง๊ต ๊ตฌ์„ฑ์œผ๋กœ "๊ณต์œ  ๊ณ ์ •"์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ "(์ •์ƒ) ๊ณต์œ "์™€ "๊ณ ์ • ๊ณต์œ "๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์†Œ์œ  ๋œ ๋˜๋Š” ๊ณ ์ • ๋œ ๋ถˆ๋ณ€์— ์ ์šฉ๋  ์ˆ˜์žˆ๋Š” "๊ณต์œ  ๋ฉ”์ปค๋‹ˆ์ฆ˜"์˜ ๊ฐœ๋…์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์˜์‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ RefCell ๋Œ€ํ•ด ํ‰ํ‰ํ•˜๊ฒŒ ๋–จ์–ด์ง€๋Š” ๊ฒƒ์„ ๋ณด์•˜ ๋“ฏ์ด- RefCell ๊ฐ€ ๊ณต์œ  ๊ณ ์ • ๊ณ ์ • ๊ณ ์ •์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•œ ์ผ์„ ๊ณต์œ  ๊ณ ์ • ๊ณ ์ •์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ & &pin RefCell<T> ์—์„œ ์ •๋‹นํ™” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. &RefCell<T> ( Deref ) borrow_mut ๋ฅผ ํ†ตํ•ด ๊ณ ์ •์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” &mut ์ฐธ์กฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฟก๋ฟก

๋“œ๋กญ์— ๊ณ ์ • ํ•ด์ œ ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ฐ”์ธ๋”ฉ์ด์—†๊ณ  ๋“œ๋กญ์ด ํ•€์„๋ฐ›๋Š” DropPinned๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค..

Drop ์˜ ์ •์˜๊ฐ€ ์—ฌ๊ธฐ์„œ ์ •๋ง๋กœ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ mem::swap ๋ฐ mem::replace ๋น„๋‚œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†Œ์œ ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ด๋™ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. T: Unpin ๊ฒฝ๊ณ„๊ฐ€ _them_?์— ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์šฐ์„ , ๋‚ด๊ฐ€ ์ง€์ ํ•œ drop ๊ตฌ๋ฉ์„ ๊ณ ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค. Shenanigans ๋Š” ์ปดํŒŒ์ผ์— ์‹คํŒจ ํ•  ๊ฒƒ์ด๊ณ , ๋‹ค๋ฅธ unsafe ์—†์ด๋Š” ํ•€ ์•ฝ์†์„ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค drop ์—์„œ ์ด์ „์— ๊ณ ์ • ๋œ ๊ฐ’์— ๋Œ€ํ•œ &mut ์ฐธ์กฐ๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ์•ˆ์ „ ํ•ด ์กŒ๋‹ค๋ฉด ์™œ drop ํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์นœ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด ์–ธ์ œ๋“ ์ง€ PinMut<T> ์—์„œ &mut ์ฐธ์กฐ๋ฅผ ๋นŒ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  PinMut ๋งค์ผ ๋ฐค ์ „๋ฅ˜์˜ ๋ฌด์—‡,๋ผ๊ณ  ์ฐธ์กฐํ•˜๊ธฐ Pin ๊ณต์œ  ํ•€์— ๋Œ€ํ•œ ํ† ๋ก ์„ ํ”ผ ํ˜ผ๋ž€์—.) PinMut<T> ๊ตฌํ˜„ํ•  ์ˆ˜ DerefMut T: Unpin ๋Œ€์‹  DerefMut ๋ฌด์กฐ๊ฑด.

& mut ๋ฐ PinMut์—์„œ ๋ชจ๋‘ ์ž‘๋™ ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์„ ์œ ์‚ฌํ•˜๊ฒŒ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. & mut์—์„œ ์ž‘์—…ํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ mem::swap ์„ (๋ฅผ) ์‚ฌ์šฉํ•  ์˜๋„๊ฐ€์—†๋Š” ๊ฒฝ์šฐ.

PinMut ์— DerefMut impl๊ฐ€ ์žˆ์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ณ ์ •์— ๊ด€์‹ฌ์ด ์žˆ๊ณ  PinMut ํ•„์š”ํ•œ ์ฝ”๋“œ๋Š” &mut ์—์„œ ์ž‘๋™ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ์‰ฝ๊ฒŒ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  mem::swap ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜์— ๋ถ€๋‹ด์ด ๊ฐ€ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค .-- ๊ทธ๋“ค์€ Unpin ๋ฐ”์šด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ unsafe ํ•˜๊ณ ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•€ ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์ด๋Ÿฌํ•œ ๊ฒฝ๊ณ„๋ฅผ swap ๋ฐ replace ์— ์ถ”๊ฐ€ํ•˜๋ฉด ์ฒซ ๋ฒˆ์งธ ์•ˆ์ •์ ์ธ ๋ฆด๋ฆฌ์Šค๋กœ ๋Œ์•„๊ฐ€๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ๊นจ์ง‘๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๊ฑฐ๊ธฐ์— ๋„์ฐฉํ•˜๋Š” ํ˜„์‹ค์ ์ธ ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ 1.0 ์ผ ์ด์ „์— ์ด๊ฒƒ์ด ์•Œ๋ ค์กŒ๋‹ค๋ฉดํ•ด์•ผ ํ•  ์ผ์ด๋˜์—ˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋‹ค๋ฅธ ๊ตฌ๋ฉ์„ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ @withoutboats๊ฐ€ ๋งํ•œ ๊ฒƒ๋ณด๋‹ค ๋” ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์€ ์—†์Šต๋‹ˆ๋‹ค. map ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ์œ ์ง€ํ•˜๊ณ  ์ด์ „์— drop ์— ๊ณ ์ • ๋œ ํ•„๋“œ์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ๋ง๋ผ๊ณ  ๊ฒฝ๊ณ ํ•˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๋ฌธ์„œ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ์ž„์˜์˜ ๊ทœ์น™์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•ˆ์ „ํ•œ ์ฝ”๋“œ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

unsafe ์‚ฌ์šฉํ•˜๋ฉด ํ•ญ์ƒ ์ฃผ๋ณ€ ์•ˆ์ „ ์ฝ”๋“œ์— ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ข‹์€ ์†Œ์‹์€ ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ํ•œ, ๊ณ ์ • ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์ฒด๊ฐ€ ๊ฐœ์ธ ํ•„๋“œ์— ํ•€์„ ํˆฌ์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ž์‹ ์˜ drop impl๋งŒ์ด์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•œ ์ฝ”๋“œ์—์„œ ๊ณ„์•ฝ์„ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ์…˜์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์˜ _users_์—๊ฒŒ ์™„์ „ํžˆ ์•ˆ์ „ํ•œ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Drop์˜ ์ •์˜๊ฐ€ ์ •๋ง๋กœ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

๋น„๋‚œ์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ๋‹ค์†Œ ์ž„์˜์ ์ด๋ฉฐ ๊ฑด์ „์„ฑ ๊ตฌ๋ฉ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝํ•  ์ˆ˜์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ์ œ์•ˆํ•œ๋Œ€๋กœ Drop ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ mem :: swap ๋ฐ mem :: replace์— ๋Œ€ํ•œ ๋น„๋‚œ์„ ๋‘๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†Œ์œ ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ์ด๋™ํ•  ์ˆ˜์žˆ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. T : Unpin bound๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด &mut T ์ผ๋ฐ˜์ ์œผ๋กœ !Unpin ์œ ํ˜•์— ์‚ฌ์šฉํ•˜๊ธฐ์— ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ PinMut ๋„ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์„œ์˜ PinMut<'a, T> ๋Š” &'a mut T ๋กœ ์ •์˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฐ ์–ธ์–ด ๋ณต์žก์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ํ๊ธฐ ๋œ ?Move ์ œ์•ˆ์ž…๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์Œ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ญ์ƒ ์ฃผ๋ณ€ ์•ˆ์ „ ์ฝ”๋“œ์— ๊ทœ์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋ฌด์Šจ ๋ง์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋ผ์ด๋ฒ„์‹œ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด์„œ์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์— ์–ด๋–ค ๊ฒƒ๋„ ๋ถ€๊ณผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ข‹์€ ์†Œ์‹์€ ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ํ•œ, ๊ณ ์ • ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ์ฒด๊ฐ€ ๊ฐœ์ธ ํ•„๋“œ์— ํ•€์„ ํˆฌ์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ž์ฒด ๋“œ๋กญ impl๋งŒ์ด์ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•œ ์ฝ”๋“œ์˜ ๊ณ„์•ฝ์„ ์œ„๋ฐ˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ์…˜์„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ•ด๋‹น ๊ตฌ์กฐ์ฒด์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์™„์ „ํžˆ ์•ˆ์ „ํ•œ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์œ ํ˜•์€ ํ”„๋กœ์ ์…˜์„ ์•ˆ์ „ํ•˜๊ฒŒ ์„ ์–ธํ•˜๋„๋ก ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฐจ์šฉ ๊ฒ€์‚ฌ๊ธฐ๋Š” ์ด๊ฒƒ์ด ํ•„๋“œ ์•ก์„ธ์Šค๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฏ€๋กœ PinMut<Struct> ์ฃผ์–ด์ง€๋ฉด ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ํ•„๋“œ์— ๋™์‹œ์— PinMut ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ์ œ์•ˆํ•œ๋Œ€๋กœ Drop์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ณ ์น  ๊ฒƒ์ด๋ผ๊ณ  ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋” ์ด์ƒ PinMut์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์„œ์˜ PinMut < 'a, T>๋Š” &'a mut T๋กœ ์ •์˜ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ถ”์ฒœ์ธ์ด ๋‹ค์‹œ๋Š” ์›€์ง์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์•ฝ์†ํ•˜๋ ค๋ฉด PinMut<'a, T> ๊ฐ€ ์—ฌ์ „ํžˆ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. &'a mut T ํ•˜๋ฉด ํ‰์ƒ 'a ๋™์•ˆ ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ฏฟ์„ ์ˆ˜์žˆ์„๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ค๋Š˜๋‚ ๊ณผ ๊ฐ™์ด ์—ฌ์ „ํžˆ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

````๋…น
๊ตฌ์กฐ์ฒด X;
impl! X {}์— ๋Œ€ํ•œ ๊ณ ์ • ํ•ด์ œ
fn takes_a_mut_ref (_ : & mut X) {}

fn loan_and_move_and_borrow_again () {
let mut x = X;
take_a_mut_ref (& mut x);
let mut b = Box :: new (x);
take_a_mut_ref (& mut * b);
}
````

PinMut<'a, T> ์—์„œ &'a mut T ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€๋งŒ ๊ทธ ๋ฐ˜๋Œ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. PinMut::new_unchecked ์€ (๋Š”) ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๊ณ  unsafe ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฐ ์–ธ์–ด ๋ณต์žก์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด ํ๊ธฐ ๋œ ?Move ์ œ์•ˆ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•Œ๊ณ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ?Move ์ œ์•ˆ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋„๋ก ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์–ป์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค PinMut ํ•จ์œผ๋กœ์จ (์œ„์˜ ์ฝ”๋“œ๋ฅผ ๊ธˆ์ง€, ๊ธฐ๋ณธ์ ์ธ ์–ธ์–ด ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•˜์—ฌ Unpin ๋Š” Move ํŠน์„ฑ์ด๋ฉ๋‹ˆ๋‹ค.) ์ €๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ ์ œ์•ˆ์€ ์ง€๊ธˆ ๋ฐค๋งˆ๋‹ค ์ •ํ™•ํžˆ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • std::mem::swap ๋ฐ std::mem::replace ํ•จ์ˆ˜์— ๋ฐ”์ธ๋”ฉ ๋œ Unpin ์ถ”๊ฐ€
  • ์ œ๊ฑฐ Unpin ์œผ๋กœ๋ถ€ํ„ฐ ๊ตฌ์† DerefMut IMPL์˜ Pin ( PinMut ๊ทธ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ)

๊ทธ๊ฒŒ ๋‹ค์ž…๋‹ˆ๋‹ค. ์›€์ง์ž„์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ทผ๋ณธ์ ์ธ ์–ธ์–ด ๋ณ€๊ฒฝ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด ์ฃผ์žฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์ด๊ฒƒ์€ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€์ด์ง€๋งŒ Drop ( ?Move ์ œ์•ˆ๋ณด๋‹ค ์—ฌ์ „ํžˆ ๋œ ๊ณผ๊ฐ ํ•จ)๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๊นจ์ง€๋Š” ์˜ํ–ฅ์ด ์ ๊ณ  ํ˜œํƒ์˜. ํŠนํžˆ ์•ˆ์ „ํ•œ ํ•€ ํ”„๋กœ์ ์…˜์„ ํ—ˆ์šฉํ•˜๊ณ  (์ ์–ด๋„ ๊ฐœ์ธ ํ•„๋“œ์— ๋Œ€ํ•ด์„œ๋Š”, ๊ณต๊ฐœ์ ์œผ๋กœ๋„ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?) PinMut ๋ฐ &mut ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๋ณ‘๋ ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, PinMut < 'a, T>๋Š” ์—ฌ์ „ํžˆ ๋Œ€์ƒ์ด ๋‹ค์‹œ๋Š” ์›€์ง์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์•ฝ์†ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. & 'a mut T๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ‰์ƒ ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ๋งŒ ๋ฏฟ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ฐธ์กฐ. ๋ง์ด๋œ๋‹ค.

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š”๋Œ€๋กœ? Move ์ œ์•ˆ์€ ์œ„์˜ ์ฝ”๋“œ ์Šค ๋‹ˆํŽซ์„ ๊ธˆ์ง€ํ•˜๋„๋ก ๊ธฐ๋ณธ ์–ธ์–ด ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•˜์—ฌ (Unpin์„ Move ํŠน์„ฑ์œผ๋กœ ๋งŒ๋“ค์–ด) PinMut์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฃผ์žฅ์€ : ์˜ˆ, ์ด๊ฒƒ์€ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€์ด์ง€๋งŒ ๋“œ๋กญ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ธŒ๋ ˆ์ดํ‚น ์˜ํ–ฅ์ด ์ ์Šต๋‹ˆ๋‹ค.

๋“œ๋กญ ํ•  ๋ณ€๊ฒฝ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? Unpin ๊ฒฝ๊ณ„๋ฅผ ์ถ”๊ฐ€ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‹น์‹  ๋ง์ด ๋งž์„์ง€ ๋ชจ๋ฅด์ง€๋งŒ mem::swap ์™€ mem::replace ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ ์•ˆ์ „ํ•œ ํ•€ ํ”„๋กœ์ ์…˜์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค (์ ์–ด๋„ ์‚ฌ์ ์ธ ๋ถ„์•ผ์˜ ๊ฒฝ์šฐ, ๊ณต๊ณต์˜ ๊ฒฝ์šฐ์—๋„ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?).

๋‚˜๋Š” ๋น„๊ณต๊ฐœ ๋Œ€ ๊ณต๊ฐœ๊ฐ€ ์—ฌ๊ธฐ์—์„œ ์–ด๋–ป๊ฒŒ ์ฐจ์ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ํผ๋ธ”๋ฆญ ํ•„๋“œ๊ฐ€ ํ”„๋ผ์ด๋น— ํ•„๋“œ๋ณด๋‹ค ์ ์€ ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ, ์ด๊ฒƒ์€ ์ „์ฒด์ ์œผ๋กœ ํ•จ๊ป˜ ์œ ์ง€๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Future ์€ (๋Š”) ์›€์ง์ด์ง€ ์•Š๋Š” ๊ฒƒ์— ์˜์กดํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— PinMut ์—ฌ์ „ํžˆ ํ•„์š”๋กœํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์˜ ๋ฒ”์œ„๊ฐ€ ๋” ๋„“์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ˜ธํ™˜์„ฑ ์ธก๋ฉด์€ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์ด๊ฒƒ์ด ํ˜„์‹ค์ ์ด์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. mem::swap / mem::replace ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ์ผ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ptr::read / ptr::write ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ ์ž์ฒด๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ธฐ์กด์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์†์ƒ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ์•ˆ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

mem::swap ๋ฐ mem::replace ์— ๋ฐ”์ธ๋”ฉ ๋œ Unpin ์„ ๋„์ž…ํ•˜๋Š” ์ฃผ์ œ์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค (ํŒŒ์†์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Œ). "์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด์žฅ"๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด. mem::forget ์— ๋™์ผํ•œ ๋ฐ”์šด๋“œ๋ฅผ ๋„์ž…ํ•˜์—ฌ ์Šคํƒ ๊ณ ์ • ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ thread::scoped ์‚ฌ์šด๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŠน์ • ๊ฒฝ์šฐ์— "๋ฐ”์ง€ ์‚ฌ์ „ ๋˜ฅ"์„ ๋ฐฉ์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

mem::forget PinBox ์€ (๋Š”) stlll ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚™ํ•˜์™€ ๊ด€๋ จํ•˜์—ฌ ์ƒˆ๋กœ ์ œ์•ˆ ๋œ ๋ณด์ฆ์€ "๋ฌผ๊ฑด์ด ๋ˆ„์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค"๋Š” ๋ง์ด ์•„๋‹™๋‹ˆ๋‹ค. " drop ๋ฅผ ๋จผ์ € ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ํ• ๋‹น ํ•ด์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋งค์šฐ ๋‹ค๋ฅธ ์ง„์ˆ ์ž…๋‹ˆ๋‹ค. ์ด ๋ณด์ฆ์€ thread::scoped ์—๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด Future ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌ์กฐ์ฒด์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค. ํ“จ์ฒ˜๊ฐ€ ์™„๋ฃŒ๊นŒ์ง€ ํด๋ง๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ (ํด๋ง์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— ์‚ญ์ œ๋จ) ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ map ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋”๋ผ๋„ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์„ ๋ฌผ 0.3์œผ๋กœ ์ด์‹ ํ•  ๋•Œ์ด ์ง€๋ขฐ๋ฅผ ์ณค์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@carllerche map ํ•จ์ˆ˜๋Š” ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•„์ฃผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ ์˜์ ์œผ๋กœ Pin<T> ์—์„œ ์ด๋™ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ณดํ˜ธํ•˜๊ณ  ์‹ถ์ง€๋„ ์•Š์ง€๋งŒ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ผœ ์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ง€๋ขฐ๋ผ๊ณ  ๋ถ€๋ฅด์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ์–ด๋–ค ์ง€๋ขฐ๋ฅผ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@RalfJung ๋‚˜๋Š” ๊ณ ์ • ์ฐธ์กฐ ๋งคํ•‘์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๋ฅผ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•ด ์™”์œผ๋ฉฐ ๊ณง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์œผ๋ฉด ์ด๊ฒƒ์ด ํฐ ๋ฐœํŒ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žก์„ฑ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฒซ ๋ฒˆ์งธ ํ•ด๊ฒฐ์ฑ…์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ • ๋œ ํ•„๋“œ์— ์•ˆ์ „ํ•˜๊ฒŒ ํ”„๋กœ์ ์…˜ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์†Œ๋น„์ž๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ณ ์ •์— ์˜์กดํ•˜๋Š” API๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ƒ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์‹ค์ œ๋กœ ๊ณ ์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ API๋Š” PinShare๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ๋ ‡๊ฒŒ ํฐ ํ•ธ๋””์บก์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ทธ ๊ฒฝ์šฐ์—๋Š” Unpin๊ณผ์˜ ๊ด€๊ณ„์— ๋Œ€ํ•ด ์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ : ๋‚ด๊ฐ€ ๊ณ ์ • ๊ณต์œ  ์ฐธ์กฐ๋ฅผ ์žก๊ณ  ์œ ํ˜•์˜ ํ•„๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ (ํŠน์ • ์ˆ˜๋ช… ๋™์•ˆ)๋ฅผ ์–ป๋Š”๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ผ์ƒ์ด ๋๋‚˜๋ฉด ์›€์ง์ด์ง€ ์•Š๋Š” ๊ฒƒ์— ์ •๋ง๋กœ ์˜์ง€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•„๋“œ๊ฐ€ !Unpin ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Pin ๊ฐ€ ํˆฌ์˜ ํ•  ์ˆ˜์—†๋Š” ํ•œ ๊ดœ์ฐฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์—ด๊ฑฐ ํ˜•์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์‹ฌ์ง€์–ด ๊ณต์œ  ๊ณ ์ •์„ ๋“œ๋กญ ๊ณ ์ •ํ•˜์ง€ ์•Š๊ณ  ์•ˆ์ „ ํ•  ์ˆ˜ ์—†๋‹ค๋Š”ํ•˜์ง€ ์•Š๋Š” -์ด ๊ฒฝ์šฐ๋ฅผ ๋‚˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณ ์ •ํ•˜์—ฌ ์ž‘์—…์— ๋“œ๋กญ ๊ณ ์ • ์ƒ๊ฐํ•˜๋Š” ์ผ์ด์žˆ๋‹ค; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹ค์ œ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ํ‹ˆ์ƒˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋Šฅ์ด๋˜๊ณ  Futures์— ๋งค์šฐ ์œ ์šฉํ•˜๋”๋ผ๋„ ํ•ต์‹ฌ ์–ธ์–ด์—์„œ ์ž๋ถ€์‹ฌ์„ ๊ฐ€์งˆ ์ž๊ฒฉ์ด ์—†์Šต๋‹ˆ๋‹ค (IMO).

๋˜ํ•œ ์ง€๊ธˆ๊นŒ์ง€ ์นจ์ž… ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์œ ์ผํ•œ ์‹ค์šฉ์ ์ธ API (๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ผฌ์ž„์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•จ)๋Š” ๊ทธ๋ณด๋‹ค ๋” ๊ฐ•๋ ฅํ•œ ๋ณด์ฆ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ์–ธ๊ธ‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ปฌ๋ ‰์…˜์— ๋นŒ๋ฆฐ ๊ฒƒ์ด ์žˆ๋Š” ํ•œ ๋“œ๋กญ์ด ํ˜ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. GhostCell ์Šคํƒ€์ผ์˜ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค์šฐ ์–ด์ƒ‰ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (ํ† ํฐ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์ปฌ๋ ‰์…˜์˜ ๋ฐฑ์—… ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋ˆ„์ถœํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ๊ทธ๋ž˜์„œ ์ž๋™ ๋“œ๋กญ ์ž์ฒด๊ฐ€ ํฅ๋ฏธ๋กœ์šด ๋ฐฉ์‹์œผ๋กœ ๊ณ ์ •์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜•์—์„œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™์•„ ์•ฝ๊ฐ„ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค.

ํ˜ธ๊ธฐ์‹ฌ : ๊ฐ€์‚ฐ์— ๋Œ€ํ•œ ์ธ์ˆ˜ ๋ฌด์—‡ Unpin ์— ๋ฐ”์ธ๋”ฉ Drop ? ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์–ธ๊ธ‰ํ–ˆ๋Š”๋ฐ, ๋“œ๋กญ๋˜๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•ด์•ผํ•œ๋‹ค๋Š” ๋Œ€์•ˆ์ด ์žˆ์ง€๋งŒ ๋“œ๋กญ์€ ์ด๋ฏธ ๋‹ค๋ฅธ ํŠน์„ฑ์— ๋Œ€ํ•ด ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ด์ƒํ•œ ์œ ํ˜•์˜ ์‹œ์Šคํ…œ ์ˆ˜์ค€ ์ œํ•œ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”? Pin<T> ๋ฐ›๋Š” ๊ฒƒ๋งŒ ํผ ์šฐ์•„ ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ์ด ์‹œ์ ์—์„œ ์‹ค์ œ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ๋‹น์‹  ๋งŒ์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ์ฝœ ๋“œ๋กญ ํ•  ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค Unpin ์œ ํ˜• ์ž์ฒด ์ธ ๊ฒฝ์šฐ, ๊ตฌํ˜„ !Unpin ? ์ œ๋„ค๋ฆญ ์œ ํ˜•์— ๋Œ€ํ•ด ์‹คํ–‰์ค‘์ธ drop ์— ์˜์กดํ•˜๋Š” ์‚ฌ๋žŒ์€ ์ด๋ฏธ ํŒจ๋‹‰ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ๊ฒฝ์šฐ ๋“œ๋กญ ๊ตฌํ˜„์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ƒˆ๋กœ์šด Drop ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋„๋ก ์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์œผ๋ฉด ์‹ค์ œ๋กœ !Unpin ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ ์ƒํƒœ๊ณ„๋Š” ๋ชจ๋“  ๊ฒƒ์„ thew new version),ํ•˜์ง€๋งŒ !Unpin ๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š๊ณ  ๊ฑด์ „์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ "๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜์ง€ ์•Š์œผ๋ฉด ์ฝ”๋“œ ํŒจ๋‹‰"์ด ๋ฐœ์ƒํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋„๋ก ์žฅ๋ ค ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์‚ฌ์‹ค, ์ œ๊ฐ€ ์ œ์•ˆํ•œ ๋””์ž์ธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Pin์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ Drop ํŠน์„ฑ ํ™•์žฅ, ์ œ์•ˆํ•œ๋Œ€๋กœ. ํŠน์ˆ˜ํ•œ ๊ธฐ๋ณธ ๊ตฌํ˜„ where T: Unpin ํ˜ธ์ถœ ๋“œ๋กญ (ํ˜„์žฌ ์ „๋ฌธํ™” โ€‹โ€‹๊ทœ์น™์„ ํ†ต๊ณผ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ?ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋”๋ผ๋„ Drop ์€ ํ•ญ์ƒ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Drop ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋™ ์ƒ์„ฑ๋จ). ์ด์ œ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๊ฐ€์—†๊ณ  ๊ฒฝ๊ณ„๋ฅผ ์–ด์ƒ‰ํ•˜๊ฒŒ ์ž๋™ ํŒŒ์ƒํ•˜๋ ค๋Š” ์‹œ๋„์—†์ด ์œ„์—์„œ ์ œ์•ˆํ•œ ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์€ ๋™์ž‘์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์จ๋“œ ํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ !Unpin ์œ ํ˜•์—์„œ ์‹ค์งˆ์ ์œผ๋กœ ์œ ์šฉํ•˜๋„๋ก ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผํ•œ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ, ์ œ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ ํ‹€๋ฆผ์—†์ด ์ข‹์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , ์–ผ๋งˆ๋‚˜ ๋งŽ์€ drop ๊ตฌํ˜„์ด ์‹ค์ œ๋กœ &mut ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค-์ œ๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์€ unsafe ๋˜๋Š” ๋‚ด๋ถ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ Pin ๊ฐ€ ์•ˆ์ •ํ™”๋˜๊ธฐ ์ „์— ์ทจํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ •๋ง๋กœ Pin ์ด (๊ฐ€) ์„œ๋‘๋ฅด์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ผ๊ณ ์žˆ๋Š” ๋˜ ํ•˜๋‚˜์˜ ์ด์œ ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋””์ž์ธ ๊ฒฐ๊ณผ๋ฅผ ์ถฉ๋ถ„ํžˆ ํƒ๊ตฌํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(I๋Š” ์ฐธ์กฐ ํ•  ๋˜ ํ•˜๋‚˜์˜ ์ž ์žฌ์  ์ธ ๋ฌธ์ œ : ManuallyDrop ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์•„๋งˆ๋„ ๊ฐ€์ • ์•Š์€ ์ œ๋„ค๋ฆญ ํ˜•์‹์„ ํ†ตํ•ด ์†Œ๋ฉธ์ž๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํ‰๊ท  ๋…ธ๋™ ์กฐํ•ฉ drop ๊ทธ ์•ˆ์—์„œ ๊ตฌํ˜„ ๋‹นํ™ฉํ•˜์ง€ ์ˆ˜๋ฅผ ๊ทธ๊ฒƒ์€ ์‹คํ–‰ํ•  ์ˆ˜ ๊ฒฐ์ฝ” ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— (๋˜ํ•œ ๋‹ค๋ฅธ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค &mut ๋‹นํ™ฉํ•˜์ง€ ์•Š๊ฒ ๋‹ค๊ณ  ์•ฝ์†ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŠน์„ฑ์— ๊ตฌํ˜„ ์‚ฌ๋žŒ์„ ์ œ์™ธํ•˜๊ณ , ์ผ๋ฐ˜ T์— ๊ธฐ๋Šฅ). ์ดํ›„ Pin ์œ ํ˜•์€ ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ๋ฉธ๋˜๊ธฐ ์ „์— ๋“œ๋กญ ๊ตฌํ˜„์ด ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค [์ƒˆ๋กœ์šด ์˜๋ฏธ ์ฒด๊ณ„์— ๋”ฐ๋ผ]. ์ €๋Š” ManuallyDrop ์—์„œ ํ•ด๋‹น ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š” !Unpin ์œ ํ˜•์„ ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ์—์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ณ ์ • ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ ํ•ด๋‹น ๊ฐ€์ •์„ํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ ์ •ํ™•ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ™•์‹คํžˆ, ManuallyDrop ์— ์•ˆ์ „ํ•˜๊ฒŒ ํ•€์„ ํˆฌ์˜ ํ•  ์ˆ˜ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋กญ ์ „์— ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์•ˆ์ „ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ์ผ€์ด์Šค๋ฅผ comp์— ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์œ ์‚ฌํ•œ ๋ชฉ์ ์„ ์œ„ํ•ด ์˜๋„ ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ "eyepatch"๋ฅผ ์ „ํ˜€ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?]. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜๋ฏธ ๋ก ์ ์œผ๋กœ ๋‚ ์•„๊ฐ€๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์•„๋งˆ๋„ ๊ธฐ์กด ์ฝ”๋“œ์— ๋Œ€ํ•œ Drop ๊ตฌํ˜„์˜ ๋ชฉ์ ์œผ๋กœ ์ž‘๋™ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„์ด ํŒจ์น˜์˜ ์ฃผ์ œ์— ๊ด€ํ•ด์„œ๋Š” ... ์•„์ง ์ •ํ™•ํ•œ ๊ณต์‹์ ์ธ ์ •์˜๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ, T์—์„œ ํฅ๋ฏธ๋กœ์šด ์ผ๋ฐ˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ผ๋ฐ˜์ ์ธ ์ƒ๊ฐ์ด ์žˆ๋‹ค๋ฉด, ๋” ๋งŽ์ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ์ฆ‰, !Unpin ์œ ํ˜•์— ๋Œ€ํ•œ drop_pinned ๊ตฌํ˜„์ด ๊ตฌํ˜„ ๋œ ๊ฒฝ์šฐ ์•„์ด ํŒจ์น˜ ๊ด€๋ จ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ํ›„ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์˜ค๋ฅ˜ ์ˆ˜์— ๋Œ€ํ•ด ๋‚˜์—๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ !Unpin ๊ตฌํ˜„ ์œ ํ˜• Drop , ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” drop_pinned ์—, ๊ทธ๋“ค์˜ ์ผ๋ฐ˜์ ์ธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์•ˆ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ์ž๊ธฐ ์ฐธ์กฐ ์ˆ˜๋ช…์ด์žˆ๋Š” ๋น„์•ˆ ๋Œ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์‹ค์กด์„ฑ์€ ๋ชจ๋“  ์ปดํŒŒ์ผ ํƒ€์ž„ ์ „๋žต์— ์‹ฌ๊ฐํ•œ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ์œ„ํ—˜์„ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋Ÿฐํƒ€์ž„์— ์‹คํŒจํ•˜๋Š” ์†”๋ฃจ์…˜์ด ๋” ํ˜„์‹ค์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๊ฐ€์—†๊ณ  ์˜ค ํƒ์ง€๋„ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์šฐ๋ฆฌ๋Š” ์ •๋ง ์†Œ๋ฉธ์ž์—์„œ ์•ก์„ธ์Šค ํ•  ํ•„๋“œ,ํ•˜์ง€์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ : ์‚ฌ์‹ค, ์œ„์˜ ๋ชจ๋“  ์Šคํฌ๋ž˜์น˜ &mut ์ผ๋ฐ˜์  ์ ‘๊ทผ, ์ˆ˜์ •์„? &mut self ์•”์‹œ ์  ํ•„๋“œ ํ”„๋กœ์ ์…˜์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฑฑ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹จ์ง€ !DynSized ์ œ์•ˆ์„ ์žฌ์ฐฝ์กฐํ•˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅด์ง€๋งŒ, ๋ณธ์งˆ์ ์œผ๋กœ : ์ œ๋„ค๋ฆญ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ•€ ์œ ํ˜• ์ƒํƒœ๋ฅผ ์‹ ๊ฒฝ ์“ฐ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๋…ธ์ถœํ•œ๋‹ค๋ฉด ์ด๋ฏธ !Unpin ๊ฐ€๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ด๊ฒƒ์ด ์ž˜๋ชป๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ๋“ค๋ฆฐ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ผ์Ÿ, ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๋ง์„ ๋“ค์–ด๋ผ!). Box<Trait> ๋ฐ &mut Trait Box<Trait> ์™€ ๊ฐ™์€ ๊ธฐ์กด ํ•ญ๋ชฉ์ด ๋ฐ˜๋“œ์‹œ Unpin ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ (์ ์–ด๋„ ํ˜„์žฌ API๋ฅผ ์ณ๋‹ค ๋ณด๋ฉด?) Pin<Box<T>> ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pin<&mut T> ๋ฐ˜๋“œ์‹œ Pin<T> ๋กœ ๊ฐ•์ œ ๋ณ€ํ™˜๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ T: !Unpin ; ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋Ÿฌํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ณ ์ • ๋œ ์ฐธ์กฐ๊ฐ€ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ๊ณ ์ • ๋œ ์•ก์„ธ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ณตํ•˜์ง€ ๋ชปํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค (& mut ๋ฐ &์˜ ๊ด€๊ณ„์™€ ๊ด€๋ จํ•˜์—ฌ ์ด์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ „๋ก€๊ฐ€ ์žˆ์Œ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. & mut & T๋Š” & mut T์— ๋Œ€ํ•ด ๊ฐ•์š” ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ & T ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. Box <& mut T>๋Š” Box<T> ๊ฐ•์ œ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ & mut T; ๋งŒ ๋‹ค๋ฅธ ์œ ํ˜• ์ƒํƒœ๊ฐ€ ์ถฉ๋Œ ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ „ํŒŒ ๋  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ &mut T , Box<T> ๋ฐ T ์€ ์œ ํ˜• ์ƒํƒœ ๊ด€์ ์—์„œ ์™„์ „ํžˆ ์ƒํ˜ธ ๊ตํ™˜ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ์ด ์ธ์ˆ˜๋Š” ๊ฐ€์ƒ์˜ ์ธ๋ผ์ธ ์‹ค์กด์„ฑ๊นŒ์ง€ ํ™•์žฅ๋˜์ง€ ์•Š์ง€๋งŒ ์•„๋งˆ๋„ ์ด๊ฒƒ์€ DynSize ์ œ์•ˆ์˜ ๋‚ด์šฉ (์•ˆ์ „ ์Šค์™‘์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํŠน์„ฑ ๊ฐœ์ฒด ๊ฐ’์— ๋Œ€ํ•ด mem::replace s๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ๋Š” ์ด๋ฏธ ํ—ˆ์šฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค ...ํ•˜์ง€๋งŒ ๋‹ค์Œ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฏธ๋ž˜์— ๋ณ€๊ฒฝ ๋  ์ˆ˜์žˆ๋Š” ์ด์œ ). ์ด๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์†”๋ฃจ์…˜์„ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. (์ „ ์ด์ ์œผ๋กœ) ์ง์ ‘ ์†Œ์œ ํ•˜๋Š” (& mut, &, Box ๋˜๋Š” ์›์‹œ ํฌ์ธํ„ฐ ์—†์Œ) Pin ์•ก์„ธ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ „ ์ด์ ์œผ๋กœ ์ „ํŒŒํ•˜์ง€ ์•Š๋Š” ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ , ๊ณต์œ  ํ•€์˜ ๊ฒฝ์šฐ & ๋ฅผ ์ œ์™ธํ•˜๊ณ  & ์€ (๋Š”) ์–ด์จŒ๋“  ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋˜๋Š” "ca n't move out of trait objects"์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ๋˜ํ•œ &mut ๋ฐ Box ๋”ฐ๋ผ ์ „ ์ด์ ์œผ๋กœ ํ•„๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  (๊ฐ€์‹œ์„ฑ ์ธก๋ฉด์—์„œ) ์•Œ๋ ค์ง„ !Unpin ์œ ํ˜• (์ž์ฒด ํฌํ•จ)์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. drop ์˜ ๋‘ ๋ฒˆ์งธ ์ข…๋ฅ˜๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ •๋œ ์œ ํ˜•์ด !Unpin ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์™„์ „ํžˆ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™๊ณ  ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ „ํ˜€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ ํ›„ ์†Œ๋ฉธ์ž๋ฅผ ๋‹ค์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ๊ฒŒ ๋‹ค์˜ˆ์š”? ๋˜ํ•œ ๋‚ด๋ถ€ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. !Unpin ํ•„๋“œ๊ฐ€ ๋…ธ์ถœ ๋œ ๊ฒฝ์šฐ์—๋งŒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ชจ๋“  ์ผ๋ฐ˜ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜• ( Vec ๋ฐ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•ญ๋ชฉ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ „์ฒด crates.io ์ƒํƒœ๊ณ„)์€ ๊ณ„์†ํ•ด์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ๋†“์นœ ์žฌ์•™์ ์ธ ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

(์‚ฌ์‹ค, drop ์ •์˜ ์‹œ๊ฐ„์— ์ด๊ฒƒ์„ ์‹œํ–‰ ํ•  ์ˆ˜ ์—†๋”๋ผ๋„ ์ ์–ด๋„ dropck ์ฒ˜๋Ÿผ ์œ ํ˜• ์ธ์Šคํ„ด์Šคํ™” ์‹œ๊ฐ„์— ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์ธ์Šคํ„ด์Šคํ™” ๋œ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—).

Dynsized ์ œ์•ˆ์„ ๋‹ค์‹œ ์ฝ์Œ : ๊ณ ์ • ๋œ ๊ฒฝ์šฐ์—๋„ ๊ณ ์ • ์œ ํ˜•์ด ํ•ญ์ƒ DynSized ์ด์–ด์•ผํ•œ๋‹ค๋Š” ์ฃผ์žฅ์— ๋ฐ˜๋Œ€ํ•˜๋Š” ์ฃผ์žฅ์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์œ„์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํŠน์„ฑ ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ์—๋งŒ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. !Unpin ์œ ํ˜•์„ + ?DynSized (๋˜๋Š” ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ ๋  ์ˆ˜ ์žˆ์Œ)๋กœ ๋ช…์‹œ ์ ์œผ๋กœ ์ œํ•œํ•ด์•ผํ•˜๋Š” ํŠน์„ฑ์— ๋Œ€ํ•ด !Unpin ์œ ํ˜•์„ ๊ฐ•์ œ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ •ํ™•ํžˆ ์„ค๋ช…ํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ). ๋ฌผ๋ก  ํฌ๊ธฐ๊ฐ€ ์•Œ๋ ค์ ธํ•ด์•ผ ๋งŽ์€ ๊ฒฝ์šฐ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ !Unpin ์œ ํ˜• (์‹ค์ œ๋กœ, ๋‚˜๋Š”! ์ด๋Ÿฌํ•œ ์œ ์Šค ์ผ€์ด์Šค๊ฐ€), ๋˜๋Š” ๊ทธ๋“ค์ด๊ฐ€ ๊ณ ์ •๋˜๊ธฐ ์ „์—, ๋‚˜๋Š” ๊ฑฐ๊ธฐ์— ํฌ๋ง์„ ๊ตํ™˜ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค ์›€์ง์ผ ์ˆ˜์—†๋Š” ์œ ํ˜•์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํŠน์„ฑ ๊ฐœ์ฒด์˜ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค (ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ์œ ์ผํ•œ ๊ฒฝ์šฐ๋Š” ๋ช…์‹œ ์ ์œผ๋กœ ๊ธˆ์ง€ํ•˜๋ ค๋Š” Box -> Rc ๋ณ€ํ™˜๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? size_of_val ๊ฐ€ ๋…ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋ฌธ์ œ์ธ์ง€ ์•„๋‹Œ์ง€๋Š” ์ €์—๊ฒŒ๋„ ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pin<'a, Box<Trait> ๋ฅผ Pin<'a, Trait> ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์„์ง€ ์•„์ง ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Sized ์— ์˜์กด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ !Unpin ๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ์ œ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์‚ฌ๋žŒ๋“ค์€ ์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ํ•„์š”๋กœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋ถ€์ •์ ์ธ ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๊ฐœ์ธ์ ์œผ๋กœ๋Š” !Unpin ํŠธ๋ ˆ์ด ํŠธ ๊ฐ์ฒด๋Š” Unpin ๊ฐ€ ์•„๋‹Œ ?Unpin ๊ฐ€์ง„ ๊ฒฝ๊ณ„ ํŠธ๋ ˆ์ด ํŠธ ๊ฐ์ฒด๊ฐ€ ์™„์ „ํžˆ ํ•ฉ๋ฆฌ์ ์ด๊ณ  ์œ ํ˜• ์‹œ์Šคํ…œ์„ ๋„ˆ๋ฌด ๋งŽ์ด ๊ฐ์—ผ์‹œํ‚ค์ง€ ์•Š์„ ์ •๋„๋กœ ์ถฉ๋ถ„ํžˆ ํฌ๊ท€ํ•˜๊ณ  ์ „๋ฌธํ™” ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์šฉ๋„๋Š” !Unpin ์ผ๋ฐ˜์ ์œผ๋กœ Pin<self> ์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ์กด ํŠน์„ฑ์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ๊ตฌํ˜„์ด ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ PinBox ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” PinTypedArena ๋˜๋Š” ?Unpin ๊ฒฝ๊ณ„๊ฐ€ ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ด๋Š” ์ง€์ ).

๋‚˜๋Š” ์ƒˆ๋กœ์šด ๋””์ž์ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ ์ด์ „ ๋””์ž์ธ๋งŒํผ ๋”์ฐํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค : https://github.com/pythonesque/pintrusive/blob/master/src/main.rs. ํ•€ ํ”„๋กœ์ ์…˜์ด ๋ชจ๋“  ๊ณณ์—์„œ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๋Œ€์‹ ์ด ๋””์ž์ธ์€ ํ•ญ์ƒ ๊ณ ์ •์„ ์ง€์›ํ•˜๊ณ ์žํ•˜๋Š” "์ตœ์‹ "Rust ์ฝ”๋“œ์—์„œ ๊ณ ์ •์— ๋Œ€ํ•ด ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” "๋ ˆ๊ฑฐ์‹œ"Rust ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์šด์šฉ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ฌป์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํ•œ ๋Œ€๋‹ต์€ @RalfJung์ด ์ œ์•ˆํ•œ PinDrop ํŠน์„ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ๋‘˜ ๋‹ค ์‚ฌ์šฉ์ž ์ง€์ • ๋“œ๋กญ์ด ์žˆ๊ณ  ํ•„๋“œ๋ฅผ ํˆฌ์˜ํ•˜๋ ค๋Š” ์œ ํ˜•์—๋งŒ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

์œ ํ˜•์€ "ํ˜„๋Œ€"Rust๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ์™€ ์œ ์‚ฌํ•œ ํ”„๋กœ์  ํŒ… ํ•„๋“œ ( PinFields ํŠน์„ฑ ํŒŒ์ƒ์— ํ•ด๋‹น)๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ "๋ ˆ๊ฑฐ์‹œ"Rust์˜ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์—†์œผ๋ฉฐ, ๋Œ€์‹  PinFields ์˜ ์ฃผ์–ด์ง„ ํŒŒ์ƒ๋ฌผ์— ๋Œ€ํ•ด ๊นŠ์ด 1 ๋กœ์˜ ํˆฌ์˜ ๋งŒ ์ง€์›ํ•˜๋„๋ก ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด Pin ์„ (๋ฅผ) ์ด๋™ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๊ทธ๋ ‡๊ฒŒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋™์ผํ•œ ํ•„๋“œ์™€ ๋ณ€ํ˜•์„ ๊ฐ€์ง„ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ Rust๊ฐ€ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๋ถ„๋ฆฌ ๋ถ„์„์„ ํฌํ•จํ•œ ๊ตฌ์กฐ์™€ ์—ด๊ฑฐ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ์œ ํ˜•์— ๋Œ€ํ•œ Pin 'd ์ฐธ์กฐ๋กœ ๋Œ€์ฒด ๋œ ์œ ํ˜• (์‚ฌ์†Œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค) ๋ณ€๊ฒฝ์‹œ Pin ๋ฐ PinMut ๋กœ ํ™•์žฅ). ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ์ด์ƒ์ ์ด์ง€๋Š” ์•Š์ง€๋งŒ (์ตœ์ ํ™” ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ€๋ถ€๋ถ„์„ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ์ง€ ๋งŒ), ์ฐจ์ž… ๋ฐ NLL๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๊ณ  ์—ด๊ฑฐ ํ˜•์œผ๋กœ ์‰ฝ๊ฒŒ ์ž‘๋™ํ•œ๋‹ค๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค (์ƒ์„ฑ ๋œ ์ ‘๊ทผ ์ž์™€ ๋ฐ˜๋Œ€).

์•ˆ์ „ ์ฃผ์žฅ์€ Drop์ด ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ „ํ˜€ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜ Drop์ด ๊ตฌํ˜„ ๋œ ๊ฒฝ์šฐ PinDrop (Pin์„ ์‚ฌ์šฉํ•˜๋Š” Drop ๋ฒ„์ „) ๋งŒ ํ˜ธ์ถœํ•˜๋Š” ์‚ฌ์†Œํ•œ ๊ตฌํ˜„์ธ์ง€ ํ™•์ธํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.). ๋‚˜๋Š” ์ด๊ฒƒ์ด ํ•˜๋‚˜์˜ ๋ฌผ์Œํ‘œ์™€ ํ•จ๊ป˜ ๊ณ ์ • ๋œ ํ•„๋“œ๋ฅผ ํˆฌ์˜ํ•˜๋Š” ๋ชจ๋“  ๊ฑด์ „์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฐ์ œํ•œ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๋Š” ์„œ๋กœ๋ฅผ ๋ฌดํšจํ™” ํ•  ์ˆ˜์žˆ๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ปจํ…Œ์ด๋„ˆ (์ฆ‰, ๊นŠ์ด 1์˜ ํ•„๋“œ)์—์„œ ๋ถ„๋ฆฌ ๋œ ํ•„๋“œ์— ๋Œ€ํ•œ ์ข‹์€ ์ฃผ์žฅ์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์†Œ๋ฉธ์ž์˜ ํ•€์€ ํ•€ ํˆฌ์˜ ์—†์ด๋Š” ์ด๋ฏธ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ PinBox์— ๋ณด๊ด€ ๋œ ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค๋ฉด์ด๋ฅผ ์ •๋‹นํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ทธ๋“ค์ด ์‚ฌ๋Š” ๊ณณ ์ด ์•ˆ์ „ ๊ณ„์•ฝ์˜ ์ผ๋ถ€์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์†Œ๋ฉธ์ž๋Š” ๊ฒฉ๋ฆฌ ์ƒํƒœ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋ชจ๋“ˆ ์™ธ๋ถ€์—์„œ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•ด์„œ, ๊ทธ๊ฒƒ๋“ค์˜ ์ •ํ™•์„ฑ์€ ์ปจํ…Œ์ด๋„ˆ ์œ ํ˜•์˜ ๊ตฌํ˜„์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ž„์˜์˜ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์†Œ๋ฉธ์ž์—๊ฒŒ ๋” ๋งŽ์€ ๊ฒƒ์„ ์š”์ฒญํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

@pythonesque ๋‚˜๋Š” DynSize ์— ๋Œ€ํ•ด ์œ„์—์„œ ์“ด ๊ฒƒ์„ ์‹ค์ œ๋กœ ๋”ฐ๋ฅด์ง€ ์•Š์•˜์ง€๋งŒ ์–ด์จŒ๋“  ์ง€๊ธˆ์€ ๊ตฌ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋ž˜์„œ, ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ตœ๊ทผ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•ด์„œ๋งŒ ๋Œ“๊ธ€์„ ๋‹ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด, ๊ตฌ์กฐ์ฒด / ์—ด๊ฑฐ ํ˜• ( pub ํ•„๋“œ ํฌํ•จ)์˜ ํ•„๋“œ์— ํ”„๋กœ์ ์…˜ํ•˜๋Š” ๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์ง€๋งŒ ์œ ํ˜•์€ Drop ๊ตฌํ˜„ํ•˜์ง€ ์•Š์Œ ์œผ๋กœ์จ ์•ˆ์ „ํ•œ ํ•„๋“œ ํ”„๋กœ์ ์…˜์— ์˜ตํŠธ ์ธ ํ•  ์ˆ˜ Drop . ์œ ํ˜•์ด ์†Œ๋ฉธ์ž๋ฅผ ์›ํ•˜๋ฉด PinDrop ๋Œ€์‹  Drop .

trait PinDrop {
  fn pin_drop(self: PinMut<Self>);
}

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ์— ๋Œ€ํ•œ ์œ ํ˜• ์ฒดํ‚น ๋ชจ์Šต์ด Drop ๊ฐ€๋„๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋น„ํ˜„์‹ค์ ์ธํ•˜์ง€ ์•Š๋Š” ๊ฒƒ, ๊ทธ๋ž˜์„œ ํ•„๋“œ์˜ ์ด์‚ฌ ๊ฑฐ๋ถ€๋ฅผ Drop ์Šค๋ฃจ ํˆฌ์‚ฌ ๊ฑฐ๋ถ€ &pin . ๋ฌผ๋ก , PinDrop ์ด ์žˆ์œผ๋ฉด "moving out of field"ํ™•์ธ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๊ฑฐ๋ถ€๋˜์ง€๋งŒ์ด ๊ฒฝ์šฐ ํ”„๋กœ์ ์…˜์€ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ๋Š” Drop ์ ์šฉ๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ œํ•œ์„ PinDrop ์— ์ ์šฉํ•˜๊ณ  ์œ ํ˜•์ด Drop ๋ฐ PinDrop ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋กญ ๊ธ€๋ฃจ๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ ์œ ํ˜•์ด ๊ตฌํ˜„ ํ•œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ Drop ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์ œ์•ˆ์„ ์š”์•ฝํ•ฉ๋‹ˆ๊นŒ? ์ œ๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์€ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์ž…๋‹ˆ๋‹ค. ๊ฑฑ์ •๋˜๋Š” ๋ถ€๋ถ„์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?


๋‹น์—ฐํžˆ ์—ฌ๊ธฐ์— ์ฆ๋ช… ์˜๋ฌด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ณด๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ PinDrop ๊ฐ€ ์‹ค์ œ๋กœ๋Š” ๊ณต์‹์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ์ฃผ๋œ ์œ ์ผํ•œ ์†Œ๋ฉธ์ž์ด๊ณ , impl Drop for T ๋Š” ์‹ค์ œ๋กœ impl PinDrop ๋Œ€ํ•œ ๊ตฌ๋ฌธ ์„คํƒ•์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ PinMut::get_mut ํ˜ธ์ถœ ํ•œ ๋‹ค์Œ Drop::drop ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž๋™ ์ƒ์„ฑ ๋œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์ด์ง€๋งŒ ๊ณ ์ •์€ "๋กœ์ปฌ ํ™•์žฅ"(์ฆ‰, ๊ธฐ์กด์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์™€ ์—ญ ํ˜ธํ™˜ ๋จ)์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์œ ํ˜•์ด ๊ณ ์ •์— ๊ด€์‹ฌ์ด์—†๋Š” ๊ฒฝ์šฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

์ข€ ๋” ๊ณต์‹์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด, ์ž‘์„ฑ์ž๊ฐ€ ๊ณ ์ •์— ๊ด€์‹ฌ์ด์—†๋Š” ๊ฒฝ์šฐ ์œ ํ˜•์ด ๊ฐ–๋Š” "๊ธฐ๋ณธ ๊ณ ์ • ๊ณ ์ •"์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ณ ์ • ๊ณ ์ •์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜•์€ ์ž๋™์œผ๋กœ Unpin ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ถˆ๋ณ€์ด์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด impl Drop ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ํ•ด๋‹น ์œ ํ˜•์ด "๊ธฐ๋ณธ ๊ณ ์ • ๋ถˆ๋ณ€"์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ฆ๋ช… ์˜๋ฌด๊ฐ€์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋ฏ€๋กœ ์•ฝ๊ฐ„ ๋น„๋ฆฐ๋‚ด์ด์ง€๋งŒ ์ด์— ๋Œ€ํ•ด ๊ฒฝ๊ณ  ํ•  unsafe ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ค‘์š”ํ•˜๋ฏ€๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํ•˜๋‹ค. ์ด๊ฒƒ์ด ์‹ค์ œ๋กœ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ๋‹ค๋ฅธ ๊ณณ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ฆ๋ช… ์˜๋ฌด๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ "๊ธฐ๋ณธ ๊ณ ์ • ๋ถˆ๋ณ€"๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์„ ์ฃผ์žฅ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์•™์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ชจ๋“ˆ์˜ ๋‹ค๋ฅธ ๊ณณ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์—†์œผ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค.

๋‚œ ์šฐ๋ฆฌ๊ฐ€์— ๋ณดํ’€์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ impl Drop for T ํ•˜์ง€ ์•Š๋Š” ํ•œ T: Unpin , ์–ด์ฉŒ๋ฉด ์œ ํ˜•์„ ์ •์˜ํ•˜๋Š” ๋ชจ๋“ˆ์ด ๊ทธ๊ฒƒ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ๋กœ ์ œํ•œ. ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๊ต์œกํ•˜๊ณ  unsafe impl Unpin (๊ณต์‹์ ์œผ๋กœ ๊ธฐ๋ณธ ๊ณ ์ • ๋ถˆ๋ณ€์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•จ)์„ ๊ถŒ์žฅํ•˜๊ฑฐ๋‚˜ impl PinDrop ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

๋ฟก๋ฟก

๊ทธ๊ฒƒ์ด ์ œ์•ˆ์„ ์š”์•ฝํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ, ๋‹ค์†Œ๊ฐ„ (Drop์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ํ”„๋กœ์ ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ์‹ค์ œ๋กœ ๋‚ด ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์•ผ์‹ฌ ์ฐฌ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•„๋งˆ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํฌ์›Œ๋“œ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ).

์ œ๊ฐ€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถ€๋ถ„์€ ๋งˆ์ง€๋ง‰ ๋‹จ๋ฝ์ž…๋‹ˆ๋‹ค. ๊ฑฑ์ •๋˜๋Š” ๋ถ€๋ถ„์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋Œ€์ฒด๋กœ ๋งํ•˜์ž๋ฉด, ๋™์ผํ•œ ๊ตฌ์กฐ์— ์ง์ ‘ ์‚ฌ๋Š” ๋‘ ๊ฐœ์˜ ํ•„๋“œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ์ค‘ ํ•˜๋‚˜๋Š” Drop์ด ํ˜ธ์ถœ ๋  ๋•Œ ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ (์•ˆ์ „์„ ์œ„ํ•ด Drop Order์™€ ๊ฐ™์€ ๊ฒƒ์— ์˜์กดํ•˜์—ฌ) ๊ณ ์ • ๋ถˆ๋ณ€์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅธ ํ•„๋“œ๋Š” ๊ตฌ์กฐ์  ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ ๊ณ ์ • ๋ถˆ๋ณ€์˜ ์œ„๋ฐ˜์„ ๋ชฉ๊ฒฉ ํ•  ์ˆ˜ ์žˆ์Œ). ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์™„์ „ํžˆ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— (๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ๋ฌด์—‡๋ณด๋‹ค๋„ dropck์— ์˜ํ•ด ๊ฑฐ๋ถ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค), ๋‚ด ๊ด€์‹ฌ์‚ฌ๋Š” ํ•„๋“œ๊ฐ€ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ณ ์ • ๋  ๋•Œ ํ•„๋“œ ์œ ํ˜•์˜ ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰ํ•˜๊ธฐ์— ์•ˆ์ „ํ•œ ์ผ๋ถ€ ๊ฐ€์ƒ์˜ ๊ฒฝ์šฐ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ด์ง€๋งŒ ๋™์ผํ•œ ๊ตฌ์กฐ์— ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด ํฌ๋ง์€ ํ•„๋“œ๊ฐ€ ํฌํ•จ ๋œ ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ณต์œ  ๋ถˆ๋ณ€์ด ์—†์œผ๋ฉด ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋ถˆ๋ณ€์„ฑ์ด์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ์ž ์ •์˜ ๋ถˆ๋ณ€์„ ์ ์ ˆํ•˜๊ฒŒ ์กด์ค‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•ด์•ผํ•˜๋ฉฐ ๋”ฐ๋ผ์„œ ๋ชจ๋“ˆ์˜ ์–ด๋”˜๊ฐ€์—์„œ ์ฝ”๋“œ๋ฅผ ๋น„๋‚œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ณด๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ PinDrop์ด ์‹ค์ œ๋กœ ๊ณต์‹์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ์ฃผ๋œ ์œ ์ผํ•œ ์†Œ๋ฉธ์ž์ด๋ฉฐ T์— ๋Œ€ํ•œ impl Drop์€ ์‹ค์ œ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ PinMut :: get_mut์„ ํ˜ธ์ถœํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” impl PinDrop์˜ ๊ตฌ๋ฌธ ์„คํƒ•์ด๋ผ๊ณ  ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Drop :: drop.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์•ˆํƒ€๊น๊ฒŒ๋„์ด ๋ฐฉ๋ฒ•์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ž‘์—…์„ ์‹œ๋„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ์†”๋ฃจ์…˜์— ๊ฐœ๋ฐฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ข€ ๋” ๊ณต์‹์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด, ์ž‘์„ฑ์ž๊ฐ€ ๊ณ ์ •์— ๊ด€์‹ฌ์ด์—†๋Š” ๊ฒฝ์šฐ ์œ ํ˜•์ด ๊ฐ–๋Š” "๊ธฐ๋ณธ ๊ณ ์ • ๊ณ ์ •"์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ณ ์ • ๊ณ ์ •์„ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ˜•์€ ์ž๋™์œผ๋กœ ๊ณ ์ • ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ๋ถˆ๋ณ€์ด์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด impl Drop์„ ์ž‘์„ฑํ•˜๋ฉด ์œ ํ˜•์ด "๊ธฐ๋ณธ ๊ณ ์ • ๋ถˆ๋ณ€"์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ฆ๋ช… ์˜๋ฌด๊ฐ€์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ๋น„๋ฆฐ๋‚ด์ด์ง€๋งŒ ์ด์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ์™„๋ฒฝํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์ด ์ค‘์š”ํ•˜๋ฏ€๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ์ด๊ฒƒ์€ ๋Œ€๋žต ์ œ๊ฐ€ ์—ผ๋‘์—๋‘๊ณ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค ... ์ €๋Š”์ด "๋ชจ๋“ˆ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ"๋ณด์žฅ์„ ์‹ค์ œ๋กœ ๊ณต์‹ํ™”ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ข‹์€ ์ง๊ด€์ด์—†๋Š” ๊ฒƒ์ด ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ณดํ‘ธ๋ผ๊ธฐ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— ๋“ค์ง€๋งŒ (์‚ฌ์‹ค, PinDrop์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์€ ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค!)ํ•˜์ง€๋งŒ unsafe impl Unpin ๊ฐ€ ์ œ์•ˆํ•˜๊ธฐ์— ์ข‹์€ ์ œ์•ˆ์ด ๋˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ž์ฃผ ํ‹€๋ ธ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ์ผ๋ฐ˜ ๊ณต์šฉ ํ•„๋“œ๊ฐ€์žˆ๋Š” ์œ ํ˜•์˜ ๊ฒฝ์šฐ (ํ•˜์ง€๋งŒ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ํ•„๋“œ๊ฐ€์—†๋Š” ๊ตฌ์กฐ์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ๋งค์šฐ ์ž์ฃผ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค ... ์˜ˆ๋ฅผ ๋“ค์–ด ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ๋Œ€์ฒด๋กœ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค).

#[derive(PinnedFields)] ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค : https://github.com/withoutboats/derive_pinned

๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด์™€ ๊ฐ™์€ ํŒŒ์ƒ๋ฌผ์ด "๊ฑด์ „ํ•˜์ง€ ์•Š๋‹ค"๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์ง€๋งŒ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋‹ค. ์ด ํŒŒ์ƒ๋ฌผ์— ์˜ํ•ด ์ƒ์„ฑ ๋œ ์ฝ”๋“œ์™€ ์ถฉ๋Œํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋กœ ์ธํ•ด ๋‹ค๋ฅธ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ๊ฑด์ „ํ•˜์ง€ ์•Š๊ฒŒ๋ฉ๋‹ˆ๋‹ค (๊ทธ๋ฆฌ๊ณ  ?Unpin ๋ฐ์ดํ„ฐ ์ฃผ์œ„๋ฅผ ์ด๋™ํ•˜๋Š” ์ฝ”๋“œ๋Š” ํ•ญ์ƒ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์ข‹์•„, ์‹ค์ œ๋กœ ์†Œ๋ฉธ์ž์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐœ์˜ ๊ฒŒ์‹œ๋ฌผ์„ ์ฝ์œผ์‹ญ์‹œ์˜ค. ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

@withoutboats ์˜ˆ, ์ด๋ฏธ ์ด๊ฒƒ์„ ๋ณธ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ฌธ์ œ๋Š” ์˜ฌ๋ฐ”๋ฅธ !Unpin ์œ ํ˜•์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ PinFields ํŒŒ์ƒ ๋œ ์œ ํ˜•์˜ ์•ˆ์ „ํ•œ ์†Œ๋ฉธ์ž์— ์˜ํ•ด ๋ฌดํšจํ™” ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž๋™ ์ƒ์„ฑ ๋œ ํ•ญ๋ชฉ์„ ์ œ์™ธํ•˜๊ณ  PinFields ํŒŒ์ƒ ๋œ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ชจ๋“ˆ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฌธ์ œ๊ฐ€๋˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜๋„ ๋งํฌ ํ•œ ๋””์ž์ธ์„ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค (๊ฐœ๋ณ„ ์ ‘๊ทผ์ž๋ฅผ ํŒŒ์ƒํ•˜๋Š” ๋Œ€์‹  ๋ณ„๋„์˜ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“œ๋Š” ์Šคํƒ€์ผ ์„ ํƒ์„ ๋ฌด์‹œํ•˜๊ณ  ๋นŒ๋ฆฐ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค). ํ•œ๋™์•ˆ ๊ฑฑ์ •ํ–ˆ์ง€๋งŒ #[derive(PinFields)] ๊ฐ€ ์—ฌ์ „ํžˆ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. Drop ๊ฐ€ ์ง์ ‘ ๊ตฌํ˜„๋˜์ง€ ์•Š๋„๋ก์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ œ๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๋˜ ๋‹ค๋ฅธ ์š”์  (์•„์ง ์–ด๋””์„œ๋„ ์ง์ ‘ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋‚˜์š”?)์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Pin ํ›จ์”ฌ ๋” ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ธฐ์กด ์ฝ”๋“œ์— ๋” ์ž˜ ํ†ตํ•ฉ ํ•  ์ˆ˜์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ๋ชจ๋“  ํฌ์ธํ„ฐ ์œ ํ˜•์ด Unpin ์ธก๋ฉด์— ๋‹จ๋‹จํžˆ ๋‚ด๋ ค๊ฐˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, &mut T , &T , *const T , *mut T , Box<T> ๋“ฑ์ด ๋ชจ๋‘ Unpin ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค ์–ด๋–ค์„ ์œ„ํ•ด T . Box<T> ๊ฒƒ์„ Unpin ์œผ๋กœ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋น„๋ฆฐ๋‚ด์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚ด๋ถ€์— Pin ์„ (๋ฅผ) ์–ป์„ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Box ์ค‘ Pin<Box<T>> . !Unpin ๋งŒ "์ธ๋ผ์ธ"์— ๊ฐ์—ผ๋˜๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ํ•ฉ๋ฆฌ์ ์ธ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ •์ด ์ฐธ์กฐ๊ฐ„์— ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” ๋‹จ์ผ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ถ๊ทน์  ์ธ &pin ์ž…๋ ฅ ์•„์ฃผ (๋‚ด๊ฐ€ ๊ทธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ํƒ€์ž…๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค, ๋‹น์‹ ์€ ์›€์ง์ž„์„ ๋ฌด์‹œํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ํ…Œ์ด๋ธ”์„ํ–ˆ๋‹ค ๊ธฐ์˜๊ฒŒ &mut pin ๊ฐ™์€ ํ–‰๋™ &mut , &pin ๋Š” & ์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๊ณ  box pin ๋Š” ๋‹ค๋ฅธ ํฌ์ธํ„ฐ์™€์˜ ๊ด€๊ณ„์™€ ๊ด€๋ จํ•˜์—ฌ box ์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ ์šด์˜์ƒ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ B ์œ ํ˜•์˜ ๊ฐ’์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จํ•˜๋Š” A ์œ ํ˜•์˜ ๊ฐ’์„ ์ด๋™ํ•ด๋„ ๋‹ค์Œ ๊ฐ’์€ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. B ์œ ํ˜•, B ์œ ํ˜•์˜ ๊ฐ’์ด A ์œ ํ˜•์˜ ๊ฐ’์— ์ธ๋ผ์ธ์ด ์•„๋‹Œ ๊ฒฝ์šฐ-ํ•˜์ง€๋งŒ์ด ๊ฒฝ์šฐ A ๋Š” ์ž๋™์œผ๋กœ !Unpin ํฌ์ธํ„ฐ ๊ฐ„์ ‘์—†์ด B ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ˜„์žฌ !Unpin ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ˆ˜๋™ ๊ตฌํ˜„์ด ํ•„์š”ํ•œ ๋งŽ์€ ์œ ํ˜•์˜ ์œ ํ˜•์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์ปฌ๋ ‰์…˜์€ ํฌ์ธํ„ฐ ๊ฐ„์ ‘ ๋’ค์— T ๋งŒ ๋ณด์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. . ์ฆ‰ ๋ชจ๋‘ ํ—ˆ์šฉ ๊ฒƒ์ด ํ˜„์žฌ Drop ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ž‘์—…์„ ๊ณ„์†ํ•˜๊ณ  ์ˆ˜ ์žˆ๋„๋ก PinDrop ์œ ํ˜• ์ธ ๊ฒฝ์šฐ ๋•Œ๋ฌธ์— (์ž์‹ ์˜ ์˜๋ฏธ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  Unpin ๊ทธ๊ฒƒ์€ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ Pin 'd ์ธ์ˆ˜๋Š” &mut ์ž…๋‹ˆ๋‹ค.)

๋‚˜๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ „ ์ด์  ๊ณ ์ •์ด ์ข‹์€ ์ƒ๊ฐ์ด ๋  ์ด์œ ๋ฅผ ๋†“์น˜๊ณ  ์žˆ์„์ง€ ๋ชจ๋ฅด์ง€๋งŒ ์ง€๊ธˆ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ฑฑ์ •ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์šด์˜์ƒ์˜ ๋ฌธ์ œ๋Š” ์ž๋™ ํŠน์„ฑ์œผ๋กœ์ด ๋™์ž‘์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๋ ‡๊ฒŒ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ์‚ฌ๋žŒ๋“ค์ด PhantomData<T> ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํฌ์ธํ„ฐ T ๊ทธ๋“ค๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค PhantomData<Box<T>> . ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ๋“ค์ด ์ •ํ™•ํžˆ ์˜๋ฏธ ์ƒ ๋™์ผํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ณ ์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์™„์ „ํžˆ ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๋‹ค.

@pythonesque "์ƒˆ๋กœ์šด ์–ธ์–ด"๋ผ๋Š” ์šฉ์–ด๋Š” ์ €์—๊ฒŒ ์ƒํ™ฉ์„

  • ๊ธฐ๋ณธ์ ์œผ๋กœ #[derive(PinFields)] ๋Š” no-op Drop impl์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์†Œ๋ฉธ์ž์—์„œ ๊ณ ์ • ๋œ ํ•„๋“œ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์„ ํƒ์  ์†์„ฑ์€์ด Drop impl์„ PinDrop::pin_drop ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜๋ฉฐ PinDrop ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒŒ ์˜ณ์€ ๊ฑฐ๋‹ˆ?


๋‚˜๋Š” ๋˜ํ•œ์ด ๋ชจ๋“  ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์นจ์ž… ์ปฌ๋ ‰์…˜์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Pin ์˜ ๋ณด์ฆ์„ ์—ฐ์žฅ ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด @RalfJung ๋ฐ @pythonesque ์ดํ•ด์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๊นŒ?


์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์†Œ ์‹ค๋ง ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด Drop ๋Š” Pin ์˜ํ•ด ์Šค์Šค๋กœ๋ฅผ ๊ฐ€์ ธ ๊ฐ€์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค! ๋ณด๋‹ค ๊ธ‰์ง„์  ์ธ (์•„๋งˆ๋„ ํš๊ธฐ์ ์ธ) ๋ณ€ํ™”๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค๋ ฅ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ํฌ๊ฒŒ ํŒŒ๊ดด๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ณ ์ • ๋œ ํ•„๋“œ + ๋“œ๋กญ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋ถˆ๊ฑด์ „ ํ•œ ์•ก์„ธ์Šค์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://play.rust-lang.org/?gist=8e17d664a5285e941fe1565ce0eca1ea&version=nightly&mode=debug

Foo ์œ ํ˜•์€ ๋ช…์‹œ ์ ์œผ๋กœ ๋งํฌ๊ฐ€ ํ•ด์ œ ๋  ๋•Œ๊นŒ์ง€ ๋ฒ„ํผ๊ฐ€์žˆ๋Š” ์œ„์น˜์— ๋จธ๋ฌผ๋„๋ก ์š”๊ตฌํ•˜๋Š” ์ผ์ข…์˜ ์™ธ๋ถ€ API์— ๋‚ด๋ถ€ ๋ฒ„ํผ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ @cramertj๊ฐ€ ์ œ์•ˆํ•œ ์ œ์•ฝ ์กฐ๊ฑด ํ•˜์—์„œ ์ด๊ฒƒ์ด ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๋Š” ํ•œ Pin<Foo> ๊ฐ€ ์ƒ์„ฑ ๋œ ํ›„์—๋Š” Drop ๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ๊นŒ์ง€ ์ด๋™๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์œ ์ถœ ๋  ์ˆ˜ ์žˆ๊ณ  Drop ๋Š” ์ ˆ๋Œ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š์ง€๋งŒ์ด ๊ฒฝ์šฐ ์ ˆ๋Œ€ ์ด๋™๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๋Š” ๋ณด์žฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.)

Bar ์œ ํ˜•์€ Drop ๊ตฌํ˜„ ์ค‘์— Foo ๋ฅผ ์ด๋™ํ•˜์—ฌ์ด๋ฅผ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

DMA๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๋Š” ๋ฌด์„  ์ฃผ๋ณ€ ์žฅ์น˜๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Foo ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์„  ์žฅ์น˜์— ์˜ํ•ด ์ž‘์„ฑ๋œ ๋‚ด๋ถ€ ๋ฒ„ํผ๊ฐ€์žˆ๋Š” StableStream ์„ (๋ฅผ) ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

์ด๊ฒŒ ์˜ณ์€ ๊ฑฐ๋‹ˆ?

์˜ˆ, ์‹ค์ œ๋กœ no-op Drop impl์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด (Rust์—์„œ Drop ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์ž˜ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ๋Œ€์‹  Drop ๊ฐ€ ์ผ๋ถ€ ๋น„๋ฆฐ๋‚ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ฃผ์žฅํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค (์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์ „๋ฌธํ™”์—์„œ ์ค‘๋‹จ๋จ-์ „๋ฌธํ™”์—์„œ ์ž‘๋™ ํ•ด์•ผ ํ•˜์ง€๋งŒ ์ง€๊ธˆ ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ์ƒ์ˆ˜์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ). ๊ทธ๊ฒƒ์ด ์–ธ์–ด ๊ธฐ๋Šฅ์œผ๋กœ ๋งŒ๋“ค์–ด ์กŒ๋‹ค๋ฉด ์ด๊ฒƒ์„ ์‹œํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ์ด ๋ชจ๋“  ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์นจ์ž…์ ์ธ ์ปฌ๋ ‰์…˜์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Pin์˜ ๋ณด์ฆ์„ ์—ฐ์žฅ ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด @ralfj ๋ฐ @pythonesque์— ๋Œ€ํ•œ ์ดํ•ด์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๊นŒ?

์•„๋‹ˆ์š”, ์•ˆํƒ€๊น๊ฒŒ๋„ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์— ๋งํฌ ๋œ ๋ฐ˜๋ก€๋Š” ์นจ์ž… ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ณด์žฅ๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. Pin 'd ์œ ํ˜•์€ ๊ณ ์ • ๋œ ์ฐธ์กฐ ๋’ค์—์„œ ๊ฐ’์— ๋Œ€ํ•ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋˜๋ฉด ๊ฐ’์ด ๋‹ค์Œ๊ณผ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ณด์žฅ ์—†์ด๋„ ๋‹ค์‹œ ์‚ฌ์šฉ๋˜๊ธฐ ์ „์— ์ด๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ • ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‘ ํ†ตํ™”๊ฐ„์— ์ด๋™ํ–ˆ๋Š”์ง€ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์นจ์ž… ์ปฌ๋ ‰์…˜์— ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ์ถ”๊ฐ€ ๋ณด์žฅ์€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋˜๊ธฐ ์ „์— drop ๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค๋Š” ์ถ”๊ฐ€ ์‚ฌํ•ญ์„ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ, ๋ณด์žฅํ•˜์ง€ ์•Š์•„๋„ drop ๋Š” ์—ฌ์ „ํžˆ ๋ฌด์–ธ๊ฐ€์— ๋Œ€ํ•ด ํ˜ธ์ถœ ๋  PinBox ์—์žˆ๋Š” ํ•„๋“œ ๊ฐ’), ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด์ „์— ๊ณ ์ •๋˜์—ˆ์„ ๋•Œ ์ฐธ์กฐ๊ฐ€ ๊ณ„์† ์œ ํšจ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ฃผ์œ„์— ์–ด๋–ค ๋ฐฉ๋ฒ•๋„ ๋ณด์ง€ ๋ชปํ•œ๋‹ค. drop ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ํ•œ ๋ชจ๋“  ์ธ๋ผ์ธ !Unpin ํ•„๋“œ์— ๋Œ€ํ•ด์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ๋žŒ๋“ค์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋„๋ก ๊ณ ์ •ํ•˜๋ ค๋ฉด drop ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ๋‚˜์œ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค์†Œ ์‹ค๋ง ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด Drop์€ Pin์ด ์Šค์Šค๋กœ๋ฅผ ๊ฐ€์ ธ ๊ฐ€์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค! ๋ณด๋‹ค ๊ธ‰์ง„์  ์ธ (์•„๋งˆ๋„ ํš๊ธฐ์ ์ธ) ๋ณ€ํ™”๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋งค๋ ฅ์ ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ํฌ๊ฒŒ ํŒŒ๊ดด๋˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„ค, ์ •๋ง ์งœ์ฆ์ด๋‚˜์š” ... ์ผ์ฃผ์ผ ๋™์•ˆ ๋„ˆ๋ฌด ์กธ ๋ ธ์–ด์š”. ๊ทธ๋Ÿฌ๋‚˜ Ralf๊ฐ€ ์ง€์ ํ–ˆ๋“ฏ์ด, ์šฐ๋ฆฌ๋Š” ๋ˆ„๊ตฐ๊ฐ€ ์ด๊ฒƒ์„ ์•Œ์•„ ๋‚ด๊ธฐ ์ „์— 1.0์„ ์œ„ํ•ด 3 ๋…„์„ ๋” ๊ธฐ๋‹ค๋ ค์•ผํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ญ์ƒ ๋” ๋งŽ์€ ๊ฒƒ์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋“œ๋กญ ๋œ ํ•ญ๋ชฉ์— ์ธ๋ผ์ธ ํ•„๋“œ๊ฐ€ ํฌํ•จ๋˜๊ณ  ํ•ด๋‹น ํ•„๋“œ์— ๋“œ๋กญ ๋œ ํ•ญ๋ชฉ์—์„œ ํ•€์„ ํˆฌ์˜ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ ์™ธ๋ถ€ ์œ ํ˜•์˜ ์†Œ๋ฉธ์ž๋Š” ์—ฌ์ „ํžˆ ๋‚ด๋ถ€ ํ•„๋“œ๋ฅผ ์ด๋™ ํ•œ ๋‹ค์Œ ์ฐธ์กฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ ๋ฅผ

๊ฐ•์กฐ๋œ ๋ถ€๋ถ„์€ ๋‚˜์—๊ฒŒ ๋งค์šฐ ํฐ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋ฌธ์ œ์˜ ํ•ต์‹ฌ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๋‚ด๋ถ€ ์ฃผ์†Œ๋ฅผ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”์ด ์ฝ”๋“œ๋ฅผ ์ƒ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

struct TwoFutures<F>(F, F);

impl Drop for TwoFutures {
     fn drop(&mut self) {
          mem::swap(&mut self.0, &mut self.1);
          unsafe { Pin::new_unchecked(&mut self.0).poll() }
     }
}

๊ทธ๋Ÿฌ๋‚˜ Pin ๋Œ์•„๊ฐ€๋ ค๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ ์ฝ”๋“œ๋Š” ๊ฑด์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

&self ๋ฐ &mut self ์„ (๋ฅผ) ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ถ€ ์ฃผ์†Œ์˜ ์œ ํšจ์„ฑ์— ์˜์กดํ•˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๊ธฐ๋Šฅ์„ ๋ฐฐ์ œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋‚˜์š”?

@withoutboats Pin<Self> ๋ฅผ ์ทจํ•˜๋Š” ๋ฐฉ๋ฒ• ๋งŒ์ด ๊ฑด์ „์„ฑ์„ ์œ„ํ•ด ๋‚ด๋ถ€ ์ฃผ์†Œ์˜ ์œ ํšจ์„ฑ์— ์˜์กดํ•˜๋”๋ผ๋„ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ํ˜•ํƒœ์˜ ์†Œ๋ฉธ์ž ์ˆ˜ mem::replace (์ž์ฒด ์‚ฌ์šฉ ๋‚ด์ธก ํƒ€์ž… ํ•„๋“œ &mut self ์ฐธ์กฐ) ๋‹ค์Œ์—, PinBox::new ๊ฐ’์„ํ•˜๊ณ  ๊ทธ ์œ„์— ๊ณ ์ • ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœ . ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ณ ์ • ๋œ ํ•„๋“œ๋ฅผ ํˆฌ์˜ ํ•  ์ˆ˜์žˆ๋Š”์—†์ด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋‹ค ์œ ์ผํ•œ ์ด์œ ๋Š” ์‹ค์ œ๋กœ ์ด์ƒํ•œ ๊ตฌํ˜„ํ•˜๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด ํ—ˆ์šฉ ๊ฐ„์ฃผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค !Unpin ์‚ฌ์šฉ ๋ฐฉ๋ฒ• unsafe (๋˜๋Š” ์ฃผ ์•Š๋Š” ์œ ํ˜• ๋ถˆ๋ณ€ ) ์•ˆ์ „ํ•œ ์ฝ”๋“œ ๋งŒ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ drop ๊ตฌํ˜„์— ๋Œ€ํ•œ ์ฆ๋ช… ์˜๋ฌด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ !Unpin ์œ ํ˜•์„ ํฌํ•จ ํ•˜๊ณ  ์ž์‹ ์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€์—†๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋Š” ๋ฌผ์–ด๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

Drop์ด ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ํ”„๋กœ์ ์…˜์„ ์ˆ˜ํ–‰ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ ์‹ค์ œ๋กœ ๋‚ด ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์•ผ์‹ฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์•„๋งˆ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํฌ์›Œ๋“œ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ ์ฃผ์œ„์— ์–ด๋–ค ๋ฐฉ๋ฒ•์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ฐ™์€ ๊ตฌ์กฐ์— ์ง์ ‘ ์‚ฌ๋Š” ๋‘ ๊ฐœ์˜ ํ•„๋“œ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ทธ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค๋ฅธ ํ•„๋“œ์˜ ๊ณ ์ • ๋ถˆ๋ณ€์„ ์œ„๋ฐ˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ Drop์ด ํ˜ธ์ถœ ๋  ๋•Œ ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค (์•ˆ์ „์„ ์œ„ํ•ด drop order์™€ ๊ฐ™์€ ๊ฒƒ์— ์˜์กด ํ•จ). ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์กฐ์  ๋ฌด๊ฒฐ์„ฑ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค (๋”ฐ๋ผ์„œ ๊ณ ์ • ๋ถˆ๋ณ€์˜ ์œ„๋ฐ˜์„ ๋ชฉ๊ฒฉ ํ•  ์ˆ˜ ์žˆ์Œ).

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ˜„์žฌ ์ด๋ฏธ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์œ„๋ฐ˜ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ impl Unpin์€ ์ œ์•ˆํ•˜๊ธฐ์— ์ข‹์€ ๊ฒƒ์ด๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ž์ฃผ ์ž˜๋ชป ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ผ๋ฐ˜ ๊ณต๊ฐœ ํ•„๋“œ๊ฐ€์žˆ๋Š” ์œ ํ˜•์˜ ๊ฒฝ์šฐ

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ •ํ™•ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ Pin<Self> ๋Œ€ํ•œ ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜๋ฉฐ์ด ๊ฒฝ์šฐ ๊ธฐ๋ณธ ๊ณ ์ • ๊ณ ์ •์„ ์‚ฌ์šฉํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์œผ๋ฏ€๋กœ unsafe impl Unpin ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค

์ €๋Š” Pin์„ ํ›จ์”ฌ ๋” ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ธฐ์กด ์ฝ”๋“œ์— ๋” ์ž˜ ํ†ตํ•ฉ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๋ชจ๋“  ํฌ์ธํ„ฐ ์œ ํ˜•์ด Unpin์ด๋ผ๋Š” ํŽธ์— ๋‹จ๋‹จํžˆ ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, & mut T, & T, * const T, * mut T, Box, ๋“ฑ๋“ฑ์€ ๋ชจ๋“  T์— ๋Œ€ํ•ด ๊ณ ์ • ํ•ด์ œ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. Box์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ˆ˜์ƒํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๊ณ ์ • ํ•ด์ œํ•˜๋ ค๋ฉด ํ•€์—์„œ ์ƒ์ž ๋‚ด๋ถ€์— ํ•€์„ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋•Œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.>.

๋‚˜๋Š” ์ด๊ฒƒ์ด ์ผ์–ด๋‚  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค (https://github.com/rust-lang/rust/pull/49621#issuecomment-378286959์—์„œ ๋‚ด ์˜๊ฒฌ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค). ํ˜„์žฌ๋Š” ์ „์ฒด ๊ณ ์ •์— ๋Œ€ํ•ด ๋” ํ™•์‹ ์„ ๊ฐ€์งˆ ๋•Œ๊นŒ์ง€ ์กฐ๊ธˆ ๊ธฐ๋‹ค๋ ค์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ํฌ์ธํ„ฐ ๊ฐ„์ ‘ ์ง€์ •์„ ๋„˜์–ด์„œ ๊ณ ์ •์„ ์ ์šฉํ•˜๋Š” ๋ฐ๋Š” ๊ฑฐ์˜ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์›์‹œ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฏธ์นœ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋™ ํŠน์„ฑ์— ๋Œ€ํ•ด ๋งค์šฐ ๋ณด์ˆ˜์ ์ž…๋‹ˆ๋‹ค.


์•ˆ๋…•ํ•˜์„ธ์š”.

# [derive (PinnedFields)]๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค : https://github.com/withoutboats/derive_pinned

@pythonesque๋Š” ์ด๋ฏธ ์ด๊ฒƒ์„ ๋งํ–ˆ์ง€๋งŒ ๋ถ„๋ช…ํ•˜๊ฒŒ @MicahChalmer ์˜ ๋“œ๋กญ ๋ฌธ์ œ ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ๋กœ ๊ณ ์ •์— ์˜์กดํ•˜๋Š” ๊ณ ์ • ์œ ํ˜•์„ ๊นฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ drop ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ๋ณด์žฅ๊ณผ๋Š” ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์˜ˆ๊ฐ€ ํ•„์š”ํ•œ์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”. ;)

๋ฟก๋ฟก

๊ทธ ๋„์„œ๊ด€์€ ๋ถˆ๊ฑด์ „ํ•ฉ๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ƒ์€ unsafe ์ด๋ฉฐ ์ˆ˜๋™ Drop impl๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŒŒ์ƒ์„ ์‚ฌ์šฉํ•˜๋ฉด Drop ๊ตฌํ˜„์— ๋‚˜์—ด๋œ ๋‚˜์œ ์ผ์„ํ•˜์ง€ ์•Š๊ฒ ๋‹ค๊ณ  ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค.

https://github.com/rust-lang/rust/pull/50497 ์€ ๊ณ ์ • API๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ณต์œ  ๋œ Pin ๋ฅผ ์ถ”๊ฐ€ ํ•  ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Pin ์—์„œ PinMut ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ Pin .


๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ์ƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ˆ˜๋™ Drop impl๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•˜๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ์—์„œ ํ˜„์žฌ๋Š” ์‹ค์ œ๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ?

@RalfJung ๋งž์•„, ์ง€๊ธˆ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„. ๋‚ด๊ฐ€ ๋ฐฉ๊ธˆ ์ƒ๊ฐํ•œ ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ "์•ˆ์ „ํ•œ"๋ฒ„์ „์ด ์œ ํ˜•์— ๋Œ€ํ•ด Drop ๊ตฌํ˜„์„ ์ƒ์„ฑํ•˜์—ฌ Drop ์˜ ๋‹ค๋ฅธ ์ˆ˜๋™ impls๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ๋„๋ ค๋ฉด unsafe ํ”Œ๋ž˜๊ทธ๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

@cramertj ๊ทธ๋ž˜๋„ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ์ œํ•œ์ ์ธ dropck์™€ ๊ฐ™์€ ๋ถ€์ž‘์šฉ์ด ์žˆ๊ณ  ํ•„๋“œ ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@pythonesque ์™€ ๋‚˜๋Š” ์›”์š”์ผ์— ์ด๊ฒƒ์„ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ „ํ™”๋ฅผ ๋ฐ›์•˜๋‹ค. ์—ฌ๊ธฐ์— ์š”์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ "์˜ฌ๋ฐ”๋ฅธ"ํ–‰๋™์ด Drop ์ด ์Šค์Šค๋กœ๋ฅผ ํ•€์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฐ๋ก ์ง€์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฏฟ๋Š” ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์—๋””์…˜ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋งค์šฐ ํŒŒ๊ดด์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ณ€๊ฒฝ์€ Drop ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด "๊ณ ์ • ํ”„๋กœ์ ์…˜"๋  ์ˆ˜์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ๋“  ์ผ๊ด€์„ฑ์ด ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ์˜ ์ €์žฅ์†Œ์—์„œ @pythonesque ๋Š” ๋ณต์žกํ•œ ํŠน์„ฑ ์„ธํŠธ์—์„œ impl์„ ์ƒ์„ฑํ•˜์—ฌ์ด๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ข€ ๋” ๊ฐ„๋‹จํ•œ ๋‚ด์žฅ ์–‘์‹์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋งˆ์ปค ํŠธ๋ ˆ์ด ํŠธ๋Š” PinProjection ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ์œ ํ˜•์„ ๊ณ ์ • ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. PinProjection ๋ฐ Drop ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ (์ปดํŒŒ์ผ๋Ÿฌ ๋‚ด์žฅ ๋งค์ง์„ ํ†ตํ•ด) ์ผ๊ด€์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ๋˜ ๋‹ค๋ฅธ ํŠน์„ฑ ์ธ PinDrop ๋Š” PinProjection ๋ฅผ ํ™•์žฅํ•˜์—ฌ Drop ๋Œ€ํ•œ ๋Œ€์ฒด ์†Œ๋ฉธ์ž๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@pythonesque ์™€ ๊ฐ™์€ ํ•€ ํ”„๋กœ์ ์…˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด PinProjection impls๋„ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ "์˜ฌ๋ฐ”๋ฅธ"ํ–‰๋™์€ Drop์ด ์Šค์Šค๋กœ๋ฅผ ์žก๋Š” ๊ฒƒ์ด์—ˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฐ๋ก ์ง€์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ฏฟ๋Š” ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์—๋””์…˜ ๋ณ€๊ฒฝ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋งค์šฐ ํŒŒ๊ดด์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์–ธ์  ๊ฐ€ ๊ทธ๋Ÿฐ ์ผ์„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ฏธ๋ž˜์™€ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ • ํ•ด ๋ด…์‹œ๋‹ค.

  • Drop ๊ณ ์ • ๋œ ์–‘์‹๊ณผ ๊ณ ์ •๋˜์ง€ ์•Š์€ ์–‘์‹์„ ๋ชจ๋‘ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ฐ›์•„๋“ค์ด๋„๋กํ•˜๊ฑฐ๋‚˜
  • Rust 2021 ๋กœ์˜ ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋“œ์˜ ์ผํ™˜์œผ๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์˜ Drop ์„œ๋ช…์„ ๋‹ค์‹œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. :)

(๋‚˜๋Š” ์ด๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์ œ์•ˆํ•˜์ง€ ์•Š์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๊ฐ€ ์—†์œผ๋ฉด ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ ๋ณด์ž…๋‹ˆ๋‹ค.)

@tmandry ๊ทธ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

ํฐ ๋ฌธ์ œ๋Š” ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ด๋™ํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ Drop ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.

struct MyType<T>(Option<T>);

impl<T> Drop for MyType<T> {
    fn drop(&mut self) {
        let moved = self.0.take();
    }
}

๋‹น์‹ ์ด ๋งํ•˜๋Š” ์ข…๋ฅ˜์˜ ์ž๋™ ์—…๊ทธ๋ ˆ์ด๋“œ๋Š”์ด Drop impl์„ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ T: Unpin ๊ฒฝ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

์†Œ๋ฉธ์ž์—์„œ ์‹ค์ œ๋กœ ?Unpin ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™ํ•˜๋Š” ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋ฏ€๋กœ ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์˜๋„ํ•˜์ง€ ์•Š์€์ด ๊ฒฝ์šฐ๋Š” ์ •๋ง ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

๋˜ ๋‹ค๋ฅธ ํŠน์„ฑ ์ธ PinDrop์€ PinProjection์„ ํ™•์žฅํ•˜์—ฌ Drop์— ๋Œ€ํ•œ ๋Œ€์ฒด ์†Œ๋ฉธ์ž๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ PinDrop ํ™•์žฅ PinProjection ? ๋ถˆํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์œ ํ˜•์ด Unpin ๊ฐ€ ์•„๋‹ˆ๋ฉด PinProjection ์™€ Drop ๊ฐ€ ํ˜ธํ™˜ ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋งํ•จ์œผ๋กœ์จ ์•ฝ๊ฐ„ ๋” ํ˜„๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋˜๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ƒˆ๋กœ์šด ๊ตฌ๋ณ„ / ์ œํ•œ ์‚ฌํ•ญ์„ ์ œ๊ฑฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์Œ Unpin ์œ ํ˜•).

@RalfJung ์šฐ๋ฆฌ๋Š” PinDrop ์™€ Drop ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋“  ์ƒํ˜ธ ๋ฐฐํƒ€์  ์ด๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์€ ๋ณ€ํ™”๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— RFC๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@withoutboats ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋…์  ์„ฑ์ด PinDrop ์˜ ํŠน๋ณ„ํ•œ ๋Œ€์šฐ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. Unpin ์œ ํ˜•์ด ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ๋งค์šฐ ์œ ์šฉ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํฌ์ธํ„ฐ ์œ ํ˜•์„ Unpin ๋ฌด์กฐ๊ฑด ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์— ๋Œ€ํ•ด ์•Œ์•„์•ผํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@withoutboats ๋˜ํ•œ ์‚ฌ๋žŒ๋“ค์ด ์†Œ๋ฉธ์ž์˜ Vec ์—์„œ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋™ํ•˜๋ ค๋Š” ์œ„์น˜๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ์ฃผ์š” ์ธ์Šคํ„ด์Šค์— ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (IIRC ์‚ฌ๋žŒ๋“ค์ด ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Vec ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„ Vec ์‚ฌ์‹ค์— ๊ด€์‹ฌ ์žˆ๋‹ค๊ณ  Pin ๊ฐ€ ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„ํ•˜์ง€ ์ˆ˜์žˆ๋Š” ์ˆ˜๋‹จ, Unpin , ๊ทธ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค) &mut Vec<T> ๋˜๋Š” Vec<&mut T> ๋˜๋Š” ๋ญ”๊ฐ€. @RalfJung์ด ์ œ์•ˆํ•œ lint์— ์˜ํ•ด ์•„๋งˆ๋„ ๋„˜์–ด ์งˆ ์ˆ˜์žˆ๋Š” ์‚ฌ๋ก€์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ์ฃผ๋กœ unsafe impl Unpin ๋Œ€์‹  ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ์‰ฝ๊ฒŒ PinDrop ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. (์ด๋ก ์ ์œผ๋กœ ๊ทธ๋“ค์€ ํ•ญ์ƒ T ๋ฅผ ์œ ํ˜•์— Unpin ๋กœ ๋ฌถ์–ด ์ „์ž๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ํด๋ผ์ด์–ธํŠธ์— ํฐ ๋ณ€ํ™”๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋˜ํ•œ ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ช‡ ๊ฐ€์ง€ ๋” ๋งŽ์€ ํŠน์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€๋งŒ ํŠน์„ฑ์€ ๊ฑฐ์˜ ๋ชจ๋“  ์œ ํ˜•์˜ ์„œ๋ช…์— ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ PinProjection ๋Š” #[derive(PinFields)] ๋งคํฌ๋กœ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š” ํ•œ ์™„์ „ํžˆ ๋ฌด์˜๋ฏธํ•œ ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ•ญ์ƒ PinProjection ๊ฐ€ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์˜ ํ•„๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๋ฉด ํ•„๋“œ๋ฅผ ํ”„๋กœ์ ์…˜ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ PinDrop ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ๊ฒƒ์— ๋Œ€ํ•œ ๋ฐ”์šด๋“œ ์ผ ํ•„์š”๊ฐ€ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ์ด์œ ๋กœ Drop ๋Š” ๊ฑฐ์˜ ๋ฐ”์šด๋“œ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠธ๋ ˆ์ด ํŠธ ๊ฐ์ฒด์กฐ์ฐจ๋„ ๊ฑฐ์˜ ์˜ํ–ฅ์„๋ฐ›์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค (์–ธ์  ๊ฐ€ "๊ด€๋ จ ํ•„๋“œ"๋ฅผ ์–ป์ง€ ์•Š๋Š” ํ•œ,ํ•˜์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ด€๋ จ ํ•„๋“œ๊ฐ€์žˆ๋Š” ํŠธ๋ ˆ์ด ํŠธ๋ฅผ PinProjection ์œ ํ˜•์—์„œ๋งŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.) ๊ทธ ๋ฌธ์ œ).

๋ฟก๋ฟก

์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ ๊ทธ๋ ‡๊ฒŒํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด Send ๋˜๋Š” Sync ๊ตฌํ˜„์„ ํ•ด์ œํ•˜๋Š” ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ๋‘˜ ๋‹ค ํ•ต์‹ฌ ์–ธ์–ด์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ Rust๊ฐ€ Copy ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ ๋œ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค ( Copy ์œ ํ˜• ๋งŒ ํฌํ•จํ•˜๊ณ  Drop ๊ตฌํ˜„ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์œ ํ˜•์€ ํ•ญ์ƒ Copy ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ) ์ด๋Š” ๊ฒฐ๊ตญ ๋ช…์‹œ ์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์‚ฌ๋žŒ๋“ค์€ ํŠน์„ฑ ( Drop )์„ ์ถ”๊ฐ€ ํ•˜๋ฉด ์ธ์‹ํ•˜์ง€ ๋ชปํ•œ ์ฑ„ ์ œ๋„ค๋ฆญ ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ข‹์•„ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค (์ผ๊ด€์„ฑ์˜ ์š”์ ์€ ํŠน์„ฑ ๊ตฌํ˜„์€ ๋‹ค์šด ์ŠคํŠธ๋ฆผ ํฌ๋ ˆ์ดํŠธ๋ฅผ ๊นจ์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ ๋‹จ์ง€์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ๊ฒƒ PinProjection ๋Œ€์‹  Copy . ๋‚˜๋Š” ์‹ค์ œ๋กœ ์˜ˆ์ „์˜ ํ–‰๋™์„ ์ข‹์•„ํ–ˆ๊ณ , Copy ๊ฐ€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ PinProjection ์ด ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ์ •๋‹นํ™”ํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ํ˜„์žฌ ์ด๋ฏธ ๋ถˆ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ๋ถˆ๋ณ€์„ฑ์„ ์œ„๋ฐ˜ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋„ค, ๋” ๋งŽ์ด ์ƒ๊ฐํ• ์ˆ˜๋ก ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์ •ํ™•ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ,ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์œ ํ˜•์ด Pin ๋ฅผ ํ•„์š”๋กœํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ผ๋ฐ˜ ํ•„๋“œ๋ฅผ ๊ณต์šฉ์œผ๋กœ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ›„์ž๋Š” ๋ณ€๊ฒฝ ๋  ๊ฒƒ ๊ฐ™์ง€ ์•Š์ง€๋งŒ ์ „์ž๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ !Unpin stdlib ์œ ํ˜• ์ค‘ ์ ์–ด๋„ ์ผ๋ถ€๊ฐ€ ํ•€ ํ”„๋กœ์ ์…˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ unsafe ๊ตฌํ˜„์€ ๋” ์ด์ƒ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๊ฝค ๊นจ์ง€๊ธฐ ์‰ฌ์šด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ๋žŒ๋“ค์ด ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ "๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ"์ฝ”๋“œ์˜ ์–‘์ด ๋Š˜์–ด๋‚˜๋Š” ๊ฒƒ์ด ๊ฑฑ์ •์ž…๋‹ˆ๋‹ค. Send ๋ฐ Sync ๊ฒฝ๊ณ„๋Š” ์ž˜๋ชป ๊ตฌํ˜„ ๋œ๋งŒํผ ์ž์ฃผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ unsafe impl 'd์ด๋ฉฐ Unpin ๋Š” ํ›จ์”ฌ ๋” ๊ตํ™œํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „์—๋Š” T ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ๋žŒ๋“ค์„ PinDrop ์œ ๋„ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์„ ํ˜ธ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (ํ•˜์ง€๋งŒ ์›์‹œ ํฌ์ธํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•ด์ฃผ์˜ํ•˜๋Š” ์ด์œ ๋Š” ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ unsafe ์ฝ”๋“œ๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  unsafe impl ๋ฅผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’์ง€๋งŒ, ์ƒ๊ฐํ•˜๋ฉดํ• ์ˆ˜๋ก ์›์‹œ ํฌ์ธํ„ฐ์˜ ๊ธฐ๋ณธ๊ฐ’์ด ์ •ํ™•ํ•˜๊ณ  ๋ณดํ’€๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

Unpin ์œ ํ˜•์€ ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ๋งค์šฐ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•ฝ๊ฐ„ ๋™์˜ํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด PinProjection ๋ฅผ ์‹ค์ œ ๋ฒ”์œ„๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ๋งํ–ˆ๋“ฏ์ด ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ํ™•์‹  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์žˆ๋‹ค DerefMut ๋Œ€ํ•œ ๊ตฌํ˜„ PinMut ๊ฒฝ์šฐ T: Unpin ์˜ค๋Š˜ ๊ทธ๊ฒƒ์„ ์–ด๋–ค ํ˜œํƒ์„ ์–ป์„ ์ˆ˜ ์—†๊ฒ ์ฃ  ๊ทธ๋ž˜์„œ. ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ๊ตฌํ˜„ ๋œ ๊ทœ์น™ (ํ”„๋กœ์ ์…˜ ์šฉ)์€ ์•„๋งˆ๋„ PinMut::new ๋ฅผ Unpin ์œ ํ˜•์— ๋Œ€ํ•œ ์ผ์ข…์˜ &pin ์žฌ์ฐจ ์šฉ์œผ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ํ•„๋“œ ํ”„๋กœ์ ์…˜๊ณผ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  PinProjection ํŒŒ์ƒํ•˜๋Š” ๋ฐ ํ•„๋“œ์— ๋Œ€ํ•ด PinProjection ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์˜ derive ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๋ฅผ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ •๋ง๋กœ ์ด๋“์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ Drop ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ๋™์‹œ์— PinProjections ๋ฅผ ํŒŒ์ƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ํ•ญ์ƒ ์‚ฌ๋žŒ๋“ค์ด PinDrop ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ ๋„ค๊ฑฐํ‹ฐ๋ธŒ IMO ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค.

IIRC ์‚ฌ๋žŒ๋“ค์ด ์‹ค์ œ๋กœ Pin์— ๊ด€์‹ฌ์ด์žˆ๋Š” Vec ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Vec์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Unpin์„ ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

ํ , ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์•„์š”. Box ์ด ๋ฌด์กฐ๊ฑด Unpin ์ด๋ฉด Vec ์ด ๋™์ผํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์œ ํ˜•์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์†Œ์œ ๊ถŒ์ด ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ drop ๋ณด์žฅ์— ๋Œ€ํ•ด์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Vec::drain ๋Š” ํŒจ๋‹‰์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ •๋ณด๊ฐ€ ์œ ์ถœ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Copy ๋Œ€์‹  PinProjection์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ์˜ ๋™์ผ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์˜ค, ์ด์ œ ๋‹น์‹ ์˜ ์งˆ๋ฌธ์„ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ œ ์ œ์•ˆ์— ์ด์™€ ๊ฐ™์€ ํŠน์„ฑ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ PinProjections ์ž๋™ ํŒŒ์ƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ ์ œ ์ œ์•ˆ์˜ ๊ฒฐ๊ณผ ์ค‘ ํ•˜๋‚˜๋Š” Drop ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐœ ๋ถ„์•ผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ Drop์„ ๊ตฌํ˜„ํ•˜๊ณ  ๋™์‹œ์— PinProjections๋ฅผ ํŒŒ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด PinDrop์„ ๊ตฌํ˜„ํ•˜์—ฌ ๊ทธ๊ฒƒ์ด net negative IMO๊ฐ€๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ์‚ฌ์‹ค ํฌ์ธํŠธ์˜€์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด์ด ๋ชจ๋“  ๊ณ ์ • ์žฅ์น˜์— ๋Œ€ํ•ด ์‹ ๊ฒฝ์„ ๋œ ์“ธ์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค.

์„ค๋ช… ์งˆ๋ฌธ : ๊ท€ํ•˜์™€ @withoutboats ์˜ ์ œ์•ˆ์—์„œ PinDrop lang ํ•ญ๋ชฉ์ด๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ Drop ์˜ ๋Œ€์ฒด๋ฌผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ derive(PinProjections) ์‚ฌ์šฉํ•˜๋Š” ํŠน์„ฑ์ผ๊นŒ์š”? Drop ๊ตฌํ˜„?

๋˜ํ•œ ๋“œ๋กญ ๋ณด์žฅ์— ๋Œ€ํ•ด์ฃผ์˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Vec :: drain์€ ํŒจ๋‹‰์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ •๋ณด๊ฐ€ ์œ ์ถœ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ๋ช…ํ™•ํ•˜๊ฒŒ ๋งํ•˜๋ฉด, Vec ์ด Unpin ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด PinDrop ์‰ฝ๊ฒŒ ์ „ํ™˜ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋” ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋ฐฑํ‚น ์š”์†Œ์— ๊ณ ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ณ ์ • ๋…ผ์˜ ์ค‘ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ๊ณ ์ •๋˜๋Š” ํ•„๋“œ ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด Vec ๋ฅผ ์ œ์ž๋ฆฌ์— Box<[T]> ๋กœ ๋ฐ”๊พผ ๋‹ค์Œ ๊ณ ์ • ํ•  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ถ„๋ช…ํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ ์ง€์  ( Box ์—์„œํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ Vec ์œ ํ˜• ๋Œ€์‹  PinVec ์œ ํ˜•์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ์Œ).

๊ทธ๊ฒŒ ์‚ฌ์‹ค ํฌ์ธํŠธ์˜€์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด์ด ๋ชจ๋“  ๊ณ ์ • ์žฅ์น˜์— ๋Œ€ํ•ด ์‹ ๊ฒฝ์„ ๋œ ์“ธ์ˆ˜๋ก ์ข‹์Šต๋‹ˆ๋‹ค.

ํ , ๋‚ด ๊ด€์ ์—์„œ๋Š” ์ฒ˜์Œ์—๋Š” ์‚ฌ์‹ค์ด์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ๊ธฐ๋ณธ๊ฐ’ ์ธ PinDrop ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์œ ํ˜•์ด ์‹ค์ œ๋กœ #[derive(PinProjections)] ๊ท€์ฐฎ๊ฒŒํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. Unpin ์ด๋ฉด ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ๋„ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค-์ƒ์„ฑ ๋œ ์ฝ”๋“œ์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฐ ๋‹ค์Œ (์•„๋งˆ๋„ &pin ๊ฐ€ ํ•œ๋™์•ˆ ์–ธ์–ด๋กœ ์‚ฌ์šฉ ๋œ ํ›„) Drop ๋ฅผ DeprecatedDrop ๋˜๋Š” ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Unpin ์œ ํ˜•์˜ ๊ฒฝ์šฐ ์œ ํ˜• ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ &mut ์—์„œ &mut pin ํ•˜๋ฉด ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค๋ช… ์งˆ๋ฌธ : ๊ท€ํ•˜์™€ @withoutboats ์˜ ์ œ์•ˆ์—์„œ PinDrop์€ lang ํ•ญ๋ชฉ์ด๋ฉฐ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ Drop์˜ ๋Œ€์ฒด๋ฌผ๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด derive (PinProjections)์—์„œ Drop์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํŠน์„ฑ์ž…๋‹ˆ๊นŒ?

์ „์ž.

์ด ์ „์ฒด Drop ํ† ๋ก ์€ ์›๋ž˜ RFC๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ์ƒ๋‹นํžˆ ๊ณผ๊ฐํ•œ ๊ฐ๋…์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด RFC๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ ค ์‚ฌํ•ญ์ด ๋ฌด์—‡์ธ์ง€, ์–ด๋–ค ์šฐ๋ ค ์‚ฌํ•ญ์ด ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๋” ์œ„ํ—˜ํ•œ์ง€, ์ •ํ™•ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์›๋ž˜ ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ์–ธ์–ด์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ธฐ๊ณ„๊ฐ€ ํ•„์š”ํ•œ์ง€, ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํŒŒ์†์ด ์˜ˆ์ƒ๋˜์–ด์•ผํ•˜๋Š”์ง€ (๊ทธ๋ฆฌ๊ณ  ์ตœ์•…์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ์ตœ์„ ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ Drop์„ ์„ฑ๊ณต์œผ๋กœ ์ด๋„๋Š” ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์ „ํ™˜ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•,์ด ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ณ  ๋‹ค๋ฅธ ์ˆ˜๋‹จ (์˜ˆ : https :)์„ ํ†ตํ•ด 2018 ๋…„ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์—๋””์…˜์œผ๋กœ ์™„ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. //github.com/rust-lang/rfcs/pull/2418์€ ์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ณต๊ฐœ API์—์„œ Pin์„ ์ˆจ๊ธธ ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค).

@bstrie ๋‚˜๋Š” ๋‹จ ํ•˜๋‚˜์˜ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฝค ์ค‘์š”ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. RFC๋Š” ์ตœ์ข… &pin mut ์œ ํ˜•์ด ์–ธ์  ๊ฐ€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ์ดํ•ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์Šน์ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

struct Foo<T> { foo : T }

fn bar<T>(x: &pin mut Foo<T>) -> &pin mut T {
  &pin mut x.foo
}

์‹ค์ œ๋กœ ๊ณ ์ • ๋œ ์ฐธ์กฐ๋Š” ์•ˆ์ „ํ•œ ์ฝ”๋“œ์—์„œ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์‹ค์ œ๋กœ ๊ตฌ์„ฑ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ๊ฐ€ ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ“จ์ฒ˜ ์กฐํ•ฉ์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด unsafe ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹œ์—๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ unsafe ์ด ํ•ด์ œ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ํฐ ๋ฌธ์ œ๋Š” ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆํƒ€๊น๊ฒŒ๋„ ์ด๊ฒƒ์ด ์•ˆ์ „ํ•œ์ง€ ์—ฌ๋ถ€๋Š” Foo ์— ๋Œ€ํ•œ Drop ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ˆ์ „ํ•œ ํ•„๋“œ ํ”„๋กœ์ ์…˜์„ ์ง€์›ํ•˜๋ ค๋ฉด (์–ธ์–ด ๊ธฐ๋Šฅ, ์‚ฌ์šฉ์ž ์ •์˜ #[derive] ๋˜๋Š” ๊ธฐํƒ€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด) ๊ทธ๋Ÿฌํ•œ ์ž˜๋ชป๋œ Drop ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. t ์ผ์–ด๋‚˜.

๊ฐ€์žฅ ์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๋Œ€์•ˆ์€ unsafe (๊ตฌ์กฐ ์œ„์— #[derive(PinProjections)] ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ)์—†์ด ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋„๋กํ•˜๊ณ  ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. . Pin ์ด ์ด๋ฏธ ์•ˆ์ •ํ™” ๋œ ๊ฒฝ์šฐ์—๋„ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ˆœ์ˆ˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ถ”๊ฐ€ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (์‹ฌ๊ฐํ•œ ์ธ์ฒด ๊ณตํ•™์  ํžˆํŠธ ํฌํ•จ). ์ ‘๊ทผ์ž๋ฅผ ์ƒ์„ฑํ•˜๋Š” #[derive] ๋งคํฌ๋กœ์™€ ์ตœ์ข… &pin ๋„ค์ดํ‹ฐ๋ธŒ ์ฐธ์กฐ ์œ ํ˜• ๋ชจ๋‘์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์ƒˆ ํŠธ๋ ˆ์ด ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•˜์ง€๋งŒ ( Drop ์˜ ๊ณ ์ • ๋œ ๋ฒ„์ „์ด ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ 2 ๊ฐœ ์ •๋„ ๊ฐ€๋Šฅ) where ์ ˆ์ด๋‚˜ ํŠธ๋ ˆ์ด ํŠธ ๊ฐ์ฒด์— ๋‚˜ํƒ€๋‚  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. drop ์˜ ์ƒˆ ๋ฒ„์ „์€ ํ˜„์žฌ Drop ๊ตฌํ˜„์ด ์žˆ๊ณ  ํ•€ ํ”„๋กœ์ ์…˜์„ ์„ ํƒํ•˜๋ ค๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

์†”๋ฃจ์…˜์ด ๋‹จ์ ์ด ๋งŽ์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๊ณ ํ•ด์„œ ์‹ค์งˆ์ ์ธ ๋ณ€ํ™”๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์˜๋ฏธ๋Š” ์•„๋‹ˆ๋ฏ€๋กœ์ด ์ œ์•ˆ์— ๋Œ€ํ•œ RFC๋ฅผ ๊ฑฐ์˜ ํ™•์‹คํ•˜๊ฒŒ ์ƒ์„ฑ ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค ( @withoutboats ๋ฐ ํ†ตํ™”์—์„œ์ด ์ž‘์—…์— ๋Œ€ํ•ด ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค). . ์™„์ „ํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฏ€๋กœ ๊ฒฉ๋ฆฌํ•˜์—ฌ ํŽ€ํŠธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ์ธ์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๊ณ ์ •์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ณต์šฉ API์—์„œ PinMut ์— ๋Œ€ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์˜ ์šฐ๋ ค๋Š” ์ •ํ™•ํžˆ unsafe ๋˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ Unpin ๊ฒฝ๊ณ„๋ฅผ ํ†ตํ•œ ์Šค๋ ˆ๋”ฉ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋ฉฐ,์ด ์ œ์•ˆ์€์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. rust-lang / rfcs # 2418์—์„œ ๋…ผ์˜ ๋œ ๋Œ€์•ˆ์€ ๊ณ ์ • (๊ณต๊ฐœ API ๋ฐ ๋ฌธ์„œ์— ๋‚˜ํƒ€๋‚  ๋‹ค์–‘ํ•œ ๋‹ค๋ฅธ ํŠน์„ฑ์˜ ํ™•์‚ฐ์„ ํฌํ•จ)์„ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์œผ๋ ค๋Š” ๋ฐฉ์‹์˜ ์‹ค์ œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์—์„œ ํ›จ์”ฌ ๋” ๋…ผ์Ÿ์˜ ์—ฌ์ง€ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์†”๋ฃจ์…˜์˜ ์ „์ฒด์ ์ธ ๋ณต์žก์„ฑ. ์‹ค์ œ๋กœ ๊ณ ์ •์ด ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ ํ•˜๋”๋ผ๋„ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ RFC๋กœ ์ ์ ˆํ•˜๊ฒŒ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š” ์งˆ๋ฌธ์ด ๋งŽ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ RFC๊ฐ€ ์•ˆ์ „ํ•œ ํ•€ ํˆฌ์˜์„ ์ถ”๊ฐ€ ํ•  ๊ฐ€๋Šฅ์„ฑ์€ ์ ์–ด๋„ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ ์ „์— ๋ฐ›์•„ ๋“ค์—ฌ์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ์ •์ด ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์žˆ๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ (๋„ˆ๋ฌด ๋นจ๋ฆฌ ์•ˆ์ •ํ™”๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ๋ถˆํ‰ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค), ์•ˆ์ „ํ•œ ํ•„๋“œ ํ”„๋กœ์ ์…˜์˜ ๋ถ€์กฑ์ด ์‚ฌ๋žŒ๋“ค์ด ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ๋งˆ์ง€๋ง‰ ์ฃผ์š” ์š”์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. . ์™„์ „์„ฑ์„ ์œ„ํ•ด ์‚ฌ๋žŒ๋“ค์ด ๊ณ ์ •์„ ํ†ตํ•ด ์ œ๊ธฐ ํ•œ ๋ชจ๋“  ๋ฌธ์ œ, ์ œ์•ˆ ๋œ ์†”๋ฃจ์…˜ ๋ฐ ์†”๋ฃจ์…˜์ด ๊ธฐ์กด Pin ์œ ํ˜•๊ณผ ํ•˜์œ„ ํ˜ธํ™˜๋˜๋Š”์ง€ ์—ฌ๋ถ€ (๋งค์šฐ ๊ฑฐ์น ๊ณ  ํŽธํ–ฅ๋œ ์ˆœ์„œ๋กœ ๋…ผ๋ž€์˜ ์—ฌ์ง€๊ฐ€ ์žˆ์Œ ๋‚˜๋Š” ํ˜„์žฌ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค) :

  • ์ด๊ฒƒ์€ (์•ˆ์ „ํ•œ ์ฝ”๋“œ๋กœ ํ”„๋กœ์  ํŒ… ํ•„๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?). ๋‹ค๊ฐ€์˜ค๋Š” RFC์— ์˜ํ•ด ํ•ด๊ฒฐ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค (๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„ ์ „๋žต๊ณผ ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•œ ๋‹ค๋ฅธ ๋Œ€์•ˆ ๋ฐ ํ๊ธฐํ•ด์•ผํ•˜๋Š” ์ด์œ ). ์ œ์•ˆ ๋œ ํ•ด์ƒ๋„์˜ ๋ชจ๋“  ๋ณ€ํ˜•์€ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜๋™ ์†Œ๋ฉธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ !Unpin ์œ ํ˜•์˜ ๊ฐ’์„ ๊ณ ์ •ํ•˜๋ฉด ์ถ”๊ฐ€ ๋ณด์žฅ (์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ๊นŒ์ง€ ๊ฐ’์˜ ๋ฐฑ์—… ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฌดํšจํ™”๋˜์ง€ ์•Š์Œ), ์ผ๋ช… "์นจ์ž… ์ˆ˜์ง‘์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ"์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

    ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์ œ์•ˆ ๋œ ์Šคํƒ ๊ณ ์ • API๊ฐ€ ์†์ƒ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ณด์ฆ์„ ์œ ์ง€ํ•˜๋Š” ์Šคํƒ ๊ณ ์ • API๊ฐ€ ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด / ๋Œ€๋ถ€๋ถ„์˜ ์ดํ•ด ๊ด€๊ณ„์ž๊ฐ€ ์ด๊ฒƒ์„ ๊ธฐ๊บผ์ด ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค (IIRC ๋ˆ„๊ตฐ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ rustc ICE'd).

    ์ด์ „ ๋ณด์ฆ๊ณผ ์—ญ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ณด์ฆ์„ ์‹œํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•œ ๋‘ ๊ฒฐ๊ณผ ๋ชจ๋‘์™€ ํ˜ธํ™˜๋˜์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ์‹œํ–‰๋˜๋Š” ๊ฒƒ์— ์˜์กด ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ณ ์ •์ด ์•ˆ์ •ํ™”๋˜๊ธฐ ์ „์— ์–ด๋–ค ๋ฐฉ๋ฒ• ์œผ๋กœ๋“  ํ•ด๊ฒฐํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

    ๋‹คํ–‰ํžˆ Future s ๊ณ ์ • ์‚ฌ์šฉ์ž๋Š” ์Šคํƒ ๊ณ ์ • API์˜ ๋ชจ์–‘ ์™ธ์—์ด๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋กœ์ € ๊ธฐ๋ฐ˜ ์Šคํƒ ๊ณ ์ • API๋Š” ๋‘ ๊ฐ€์ง€ ํ•ด์ƒ๋„ ์ค‘ ํ•˜๋‚˜์™€ ํ˜ธํ™˜๋˜๋ฏ€๋กœ async / await๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Future ์‚ฌ์šฉ์ž๋Š” ์ด๊ฒƒ์ด ๊ฒฐ์ •๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์˜ค๋Š˜ ํด๋กœ์ € ๊ธฐ๋ฐ˜ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์€ ๋‹ค๋ฅธ ๋ชฉ์  (์˜ˆ : ์นจ์ž… ์ปฌ๋ ‰์…˜)์œผ๋กœ ๊ณ ์ •์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

  • ์›์‹œ ํฌ์ธํ„ฐ๋Š” ๋ฌด์กฐ๊ฑด Unpin ์ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ œ์•ˆํ•œ ์œ ์ผํ•œ ์‚ฌ๋žŒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ์—ฌ์ „ํžˆ ๊ฑฐ์˜ 50-50์ž…๋‹ˆ๋‹ค.) ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ๋กœ ๊ทธ ์ด์œ  ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋…ผ๋ž€์˜ ์—ฌ์ง€๋กœ ํ‘œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • Vec ์™€ ๊ฐ™์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์„ ๋ฌด์กฐ๊ฑด Unpin ๋กœ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด Pin ํ•„๋“œ ์ ‘๊ทผ์ž๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์‚ฌ๋ก€๋ณ„๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์–ด์ง„ ์•ˆ์ „ํ•œ ๋ž˜ํผ ์œ ํ˜•์— ๋Œ€ํ•ด ์ ‘๊ทผ์ž๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์œ ํ˜•์„ ๋ฌด์กฐ๊ฑด Unpin ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • PinMut::deref ์„ ์ œ๊ฑฐํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? ๋Œ€๋‹ต์€ ๊ธฐ๋ณธ์ ์œผ๋กœ "์•„๋‹ˆ์˜ค"์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ ์ง€ํ•˜๋Š” ์ด์ ์ด ๋‹จ์ ๋ณด๋‹ค ํ›จ์”ฌ ํฐ ๊ฒƒ ๊ฐ™๊ณ , ์›๋ž˜ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ์›ํ•˜๊ฒŒ ๋งŒ๋“  ์‚ฌ๋ก€ (ํŠนํžˆ Pin<RefCell<T>> )์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•˜๋ฉด ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‹จ๊ธฐ๊ฐ„์— ํ•„๋“œ ์ ‘๊ทผ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ (๋“œ๋กญ ๋ฌธ์ œ ๋ฌด์‹œ)? ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Œ : ์ง€๊ธˆ๊นŒ์ง€ ์ œ์‹œ๋œ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์€ https://github.com/withoutboats/derive_pinned ๋ฐ https://github.com/pythonesque/pintrusive์ž…๋‹ˆ๋‹ค. ๋“œ๋กญ์ด ๋ณ€๊ฒฝ๋œ ํ›„์—๋Š” ์ˆœ์ˆ˜ํ•˜๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ์—์„œ ๋งคํฌ๋กœ์—์„œ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ•ด์ƒ๋„๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ ์™„์ „ํžˆ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ์žฅ๊ธฐ์ ์œผ๋กœ ํ•„๋“œ ์ ‘๊ทผ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ (์˜ˆ : ์‚ฌ์šฉ์ž ์ •์˜ &mut pin ๋ฐ &pin Rust ์œ ํ˜•์ด ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ์žฌ์ฐจ ์šฉ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?). ์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“  ์ œ์•ˆ ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ (๋‚ด๊ฐ€ ์•„๋Š” ํ•œ)๊ณผ ์—ญ ํ˜ธํ™˜๋˜๋ฉฐ ๋ฌด๊ธฐํ•œ์œผ๋กœ ํŽ€ํŒ… ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์•ˆ์ „ํ•œ ์ฐธ์กฐ ์œ ์‚ฌ ์œ ํ˜•์€ ๋ฌด์กฐ๊ฑด Unpin ์ด์–ด์•ผํ•ฉ๋‹ˆ๊นŒ? ํ•ด๊ฒฐ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์˜ˆ, ๊ทธ๋ž˜์•ผํ•ฉ๋‹ˆ๋‹ค). ํ•ด์ƒ๋„๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ ์™„์ „ํžˆ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.
  • ํ•„๋“œ ์ ‘๊ทผ์ž๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ณ ์œ  ํ•œ Pin Pin ์œ ํ˜• ์™ธ์— ๊ณต์œ  &Pin ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ)? ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด Pin ์—์„œ PinMut ๋˜๊ณ  ๊ณต์œ  ์‚ฌ๋ก€์— ๋Œ€ํ•ด Pin ์œ ํ˜•์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€๋Š” ์•Š์•˜์ง€๋งŒ ๋ธŒ๋ ˆ์ดํ‚น ์ฒด์ธ์ง€ ( Pin ์—์„œ PinMut )๊ฐ€ ์ด๋ฏธ ์ด๋ฃจ์–ด์กŒ๊ณ  ์ด๊ฒƒ์ด ์ด๋ฏธ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ›์•„ ๋“ค์—ฌ ์กŒ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ฑฐ์˜ ๊ทธ๊ฒƒ์„ ๋ฎ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด (์›์‹œ ํฌ์ธํ„ฐ์™€ deref ๊ฒฐ์ • ์™ธ์—, ํ›„์ž๋Š”์ด ์‹œ์ ์—์„œ ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐ ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค) ๊ณ ์ •์ด ์˜ค๋Š˜ ์•ˆ์ •ํ™” ๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ•„๋“œ ํ”„๋กœ์ ์…˜์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์€ API์—์„œ ๊ณ ์ • ๋œ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์ค‘์— ํ›„ํšŒํ•˜๊ฒŒ ๋  ๊ฒฐ์ •์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ์งˆ๋ฌธ ์™ธ์—๋„ ํ›จ์”ฌ ๋” ๊ทผ๋ณธ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ ์ •์„ ์žฌ๊ณ ํ•˜๋ ค๋Š” ๋‹ค๋ฅธ ์ œ์•ˆ์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์žฅ ์ž˜ ์ดํ•ดํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋‘ ๊ฐ€์ง€๋Š” !Unpin ์œ ํ˜• !DynSized ์„ ๋งŒ๋“ค๋ผ๋Š” @comex ์ œ์•ˆ๊ณผ steven099 (๋‚ด๋ถ€์ ์œผ๋กœ ๋ฏธ์•ˆํ•ฉ๋‹ˆ๋‹ค. Github ์ด๋ฆ„์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค) ์ œ์•ˆ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ถ€๋ฅผ ์›€์ง์ผ ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ์ƒˆ๋กœ์šด ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ Pinned ๋ž˜ํผ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค (ZST ๋ž˜ํผ์™€ ์œ ์‚ฌ ํ•จ).

!DynSized ์˜ต์…˜์€ ๋ถˆํˆฌ๋ช… ํ•œ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์ด๋ฏธ ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด์žˆ๋Š” ์ƒ๋‹นํžˆ ๋ณด์ˆ˜์  ์ธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค (Rust๊ฐ€ ์ด๋ฏธ ์œ ์‚ฌํ•œ ํŠน์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์—์„œ). ์ด๋Ÿฌํ•œ ์˜๋ฏธ์—์„œ Drop ๋Œ€ํ•ด ์ œ์•ˆ ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋ณด๋‹ค ๋œ ์นจ์Šต์  ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. !Unpin ์œ ํ˜•์ด !DynSized ์ด๋ฏ€๋กœ !DynSized Drop ๋ฌธ์ œ๋ฅผ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ฏ€๋กœ ์ด์ ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด T ์ด !DynSized ๊ฒฝ์šฐ &mut T ๋ฐ &T ์ž๋™์œผ๋กœ PinMut ๋ฐ Pin !DynSized ๋กœ ์ž‘๋™ํ•˜๋ฏ€๋กœ &mut T ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ณ ์ • ๋œ ๋ฒ„์ „์˜ ์œ ํ˜• ๋ฐ ๋ฉ”์„œ๋“œ๊ฐ€ ํ™•์‚ฐ ๋  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค (ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ DynSized ๋ฐ”์ธ๋”ฉ์„ ์š”๊ตฌํ•˜์ง€ ์•Š๋„๋ก ์ˆ˜์ • ๋œ ๊ฒฝ์šฐ). ).

?Trait ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์šฐ๋ ค ์‚ฌํ•ญ ์™ธ์— ์ฃผ์š” ๋‹จ์ ์€ !Unpin ์œ ํ˜•์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ๊ณ ์ • ๋œ ์œ ํ˜•์˜ ์ƒํ™ฉ๊ณผ๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‘ ๊ฐœ์˜ ๊ณ ์ • ๋œ ์œ ํ˜•์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ (์–ด์จŒ๋“  ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ) ์ด์— ๋Œ€ํ•œ ์ œ์•ˆ ๋œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋Š”์ง€ ๋˜๋Š” ๋ฐฉ๋ฒ•์ด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IIRC ์ด๊ฒƒ์€ &move ์ œ์•ˆ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์˜๋„๋˜์—ˆ์ง€๋งŒ ๊ทธ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋˜ํ•œ ๋ถˆํˆฌ๋ช… ํ•œ ์œ ํ˜•์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ์•ˆ์ „ํ•œ ํ•„๋“œ ํ”„๋กœ์ ์…˜์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ (์ œ์•ˆ์—์„œ) ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ Pinned<T> ์œ ํ˜•์€ ์ •์‹ ์ ์œผ๋กœ ๋‹ค์†Œ ์œ ์‚ฌํ•˜์ง€๋งŒ ZST๋กœ ์œ ํ˜•์„ ๊ฐ์Œ€ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ ์œ„์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค (ํšจ๊ณผ์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ž‘๋™). Rust๋Š” ํ˜„์žฌ ๋งค์šฐ ๋น„๊ตํ• ๋งŒํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค : PhantomData ์€ ์‹ค์ œ๋กœ ์œ ํ˜•์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋‹ค๋ฅธ ๋™์  ํฌ๊ธฐ ์œ ํ˜•์€ ๋šฑ๋šฑํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์—ฌ์ „ํžˆ ์ด๋™์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค ( size_of_val ์— ์˜์กดํ•˜๋Š” API ์‚ฌ์šฉ) ?DynSized ์ด ๊ณ ์น˜๊ธฐ์œ„ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ์ด ์ œ์•ˆ์€ ์•„๋งˆ๋„ ๊ทธ ํŠน์„ฑ์— ๋‹ค์‹œ ํ”ผ๊ธฐ ๋ฐฑ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค). ์•ˆ์ „ํ•œ ํ”„๋กœ์ ์…˜์„ ํ—ˆ์šฉํ•˜๋ฉด์ด ์ œ์•ˆ์ด ์‹ค์ œ๋กœ Drop ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š๊ณ  Deref ์™€๋„ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ Pin ๋ณด๋‹ค ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค

์ด ๋ณด์ฆ์„ ์œ ์ง€ํ•˜๋Š” ์Šคํƒ ๊ณ ์ • API๊ฐ€ ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค์–ด ์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด / ๋Œ€๋ถ€๋ถ„์˜ ์ดํ•ด ๊ด€๊ณ„์ž๊ฐ€ ์ด๊ฒƒ์„ ๊ธฐ๊บผ์ด ๋ฐ›์•„๋“ค์ด๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค (IIRC ๋ˆ„๊ตฐ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ rustc ICE'd)

์ฐธ๊ณ ๋กœ, ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์ค‘์ฒฉ ๋œ ์ƒ์„ฑ๊ธฐ ๊ธฐ๋ฐ˜ ์Šคํƒ ๊ณ ์ • API์—์„œ ์‹œ๋„ํ•œ https://github.com/rust-lang/rust/issues/49537 ์„

์•„์ง ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„ ์ œ์•ˆ ๋œ ์Šคํƒ ๊ณ ์ • API๊ฐ€ ์†์ƒ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋ณด์ฆ์„ ์œ ์ง€ํ•˜๋Š” ์Šคํƒ ๊ณ ์ • API๊ฐ€ ๋น„๋™๊ธฐ๋กœ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด / ๋Œ€๋ถ€๋ถ„์˜ ์ดํ•ด ๊ด€๊ณ„์ž๊ฐ€ ์ด๊ฒƒ์„ ๊ธฐ๊บผ์ด ๋ฐ›์•„๋“ค์ด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค (IIRC ๋ˆ„๊ตฐ๊ฐ€ ์ด๋ฏธ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ rustc ICE'd).

๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ ํด๋กœ์ € ๊ธฐ๋ฐ˜ ์Šคํƒ ๊ณ ์ • API๋ฅผ๋ณด๊ณ ์žˆ๋‹ค. (ํ•œ ๋ฒˆ &pin ์€ (๋Š” ํ•œ ๋ฒˆ ๋งคํฌ๋กœ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์›์‹œ ํฌ์ธํ„ฐ๋Š” ๋ฌด์กฐ๊ฑด ๊ณ ์ • ํ•ด์ œํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? [...] ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ๋กœ ๊ทธ ์ด์œ  ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋…ผ๋ž€์˜ ์—ฌ์ง€๋กœ ํ‘œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

impl Unpin for Vec<T> ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์ด ์žˆ์ง€๋งŒ ์›์‹œ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๊ฐ€์žฅ ํฐ ๋‹จ์ ์€ (? Trait์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ์šฐ๋ ค๋ฅผ ์ œ์™ธํ•˜๊ณ )! Unpin ์œ ํ˜•์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ˜„์žฌ ๊ณ ์ • ์œ ํ˜•์˜ ์ƒํ™ฉ๊ณผ๋Š” ์ƒ๋‹นํžˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋‘ ๊ฐœ์˜ ๊ณ ์ • ๋œ ์œ ํ˜•์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ (์–ด์จŒ๋“  ๋‚ด๊ฐ€ ๋งํ•  ์ˆ˜์žˆ๋Š” ํ•œ) ์ด์— ๋Œ€ํ•œ ์ œ์•ˆ ๋œ ํ•ด๊ฒฐ์ฑ…์ด ์žˆ๋Š”์ง€ ๋˜๋Š” ๋ฐฉ๋ฒ•์ด ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. IIRC ์ด๊ฒƒ์€ & move ์ œ์•ˆ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์˜๋„๋˜์—ˆ์ง€๋งŒ ๊ทธ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์Œ, @ steven099์˜ ๋ณ€ํ˜• ์ œ์•ˆ (๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š”)์—์„œ, ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉ (์ง€๊ธˆ์€) ๊ฒƒ Pinned<T> ํฌํ•จํ•˜๋Š”, T ๊ฐ’์ด ์•„๋‹ˆ๋ผ์ž…๋‹ˆ๋‹ค !Sized ( ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ !DynSized ; ํŠธ๋ ˆ์ด ํŠธ ๊ณ„์ธต ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ๋””์ž์ธ์€ ์ž์ „๊ฑฐ ํ†ตํ–‰์— ๊ฐœ๋ฐฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ ์‹ค์ œ๋กœ &'a mut Pinned<T> ๊ฐ€ Pin<'a, T> ์„œ์žˆ๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ธฐ์กด ์ œ์•ˆ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ &mut T ( T: ?Sized )์—์„œ ์ผ๋ฐ˜์ ์ธ ํ˜„์žฌ ๋ฐ ํ–ฅํ›„ ์ฝ”๋“œ๋กœ ๋” ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ง„์ •ํ•œ ๋„ค์ดํ‹ฐ๋ธŒ ๊ณ ์ • ์œ ํ˜•์— ๋Œ€ํ•œ ํ–ฅํ›„ ๋””์ž์ธ๊ณผ ๋” ์—ญ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. Pinned ํ•ฉ๋‹ˆ๋‹ค.

๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด Pinned ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

extern { type MakeMeUnsized; }

#[fundamental]
#[repr(C)]
struct Pinned<T> {
    val: T,
    _make_me_unsized: MakeMeUnsized,
}

์ผ๋ฐ˜์ ์œผ๋กœ Pinned<T> ์ง์ ‘ ๊ตฌ์„ฑํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  Foo<T> ์—์„œ Foo<Pinned<T>> ๋กœ ์บ์ŠคํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Foo ๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š๋„๋ก ๋ณด์žฅํ•˜๋Š” ์Šค๋งˆํŠธ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค.

// This would actually be a method on Box:
fn pin_box<T>(b: Box<T>) -> Box<Pinned<T>> {
    unsafe { transmute(b) }
}

(์•„๋งˆ๋„ ๋งคํฌ๋กœ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•˜๋Š” ์Šคํƒ ๊ณ ์ • API๋„์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค.)

์ด ์˜ˆ์—์„œ FakeGenerator ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ƒ์„ฑ ์ƒ์„ฑ๊ธฐ ์œ ํ˜•์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

enum FakeGenerator {
    Initial,
    SelfBorrowing { val: i32, reference_to_val: *const i32 },
    Finished,
}

FakeGenerator ๊ฐ’์ด ๊ณ ์ •๋˜๋ฉด ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋Š” ๋” ์ด์ƒ ๊ฐ’ ( foo: FakeGenerator ) ๋˜๋Š” ์ฐธ์กฐ ( foo: &mut FakeGenerator )๋กœ ์ง์ ‘ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. swap ๋˜๋Š” replace ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์‚ฌ์šฉ์ž ์ฝ”๋“œ๋Š” &mut Pinned<FakeGenerator> ์™€ ๊ฐ™์ด ์ง์ ‘ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๋Š” ๊ธฐ์กด ์ œ์•ˆ์˜ PinMut<'a, FakeGenerator> ์˜ ๊ทœ์น™๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋” ๋‚˜์€ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ์„ฑ์˜ ์˜ˆ๋กœ, ์ปดํŒŒ์ผ๋Ÿฌ ์ƒ์„ฑ impl์€ Pin<Self> ํ•˜๋Š” ์ƒˆ ํŠน์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด Iterator ํŠน์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

impl Iterator for Pinned<FakeGenerator> {
    type Item = i32;
    fn next(&mut self) -> Option<Self::Item> {
        /* elided */
    }
}

๋ฐ˜๋ฉด์—, ์ดˆ๊ธฐ ๊ตฌ์„ฑ์˜ ๊ฒฝ์šฐ ๊ณ ์ •๋˜๊ธฐ ์ „์— ์ž์ฒด ์ฐจ์šฉ์ด ์•„๋‹Œ ์ƒํƒœ์—๋งŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•˜๋Š” ํ•œ FakeGenerator ๊ฐ’์„ ์ง์ ‘ ์ „๋‹ฌํ•˜๊ณ  ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

impl FakeGenerator {
    fn new() -> Self { FakeGenerator::Initial }
}

๋”ฐ๋ผ์„œ ๋‘ ๊ฐœ์˜ FakeGenerator ๋ฅผ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๊ตฌ์„ฑ์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

struct TwoGenerators {
    a: FakeGenerator,
    b: FakeGenerator,
}

impl TwoGenerators {
    fn new() -> Self {
        TwoGenerators {
            a: FakeGenerator::new(),
            b: FakeGenerator::new(),
        }
    }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ TwoGenerators ๊ฐœ์ฒด๋ฅผ ์ „์ฒด์ ์œผ๋กœ ๊ณ ์ • ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

let generator = pin_box(Box::new(TwoGenerators::new()));

๊ทธ๋Ÿฌ๋‚˜ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด &mut Pinned<TwoGenerators> ์—์„œ &mut Pinned<FakeGenerator> ( a ๋˜๋Š” b ์•ก์„ธ์Šค)๋กœ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ• ์ธ ํ•„๋“œ ํ”„๋กœ์ ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ๋„ ๊ธฐ์กด Pin ๋””์ž์ธ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

// Some helper methods:
impl<T> Pinned<T> {
    // Only call this if you can promise not to call swap/replace/etc.:
    unsafe fn unpin_mut(&mut self) -> &mut T {
        &mut self.val
    }
    // Only call this if you promise not to call swap/replace/etc. on the
    // *input*, after the borrow is over.
    unsafe fn with_mut(ptr: &mut T) -> &mut Pinned<T> {
        &mut *(ptr as *mut T as *mut Pinned<T>)
    }
}

// These accessors would be macro-generated:
impl Pinned<TwoGenerators> {
    fn a(&mut self) -> &mut Pinned<FakeGenerator> {
        unsafe { Pinned::with_mut(&mut self.unpin_mut().a) }
    }
    fn b(&mut self) -> &mut Pinned<FakeGenerator> {
        unsafe { Pinned::with_mut(&mut self.unpin_mut().b) }
    }
}

๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ์กด ๋””์ž์ธ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋งคํฌ๋กœ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ Drop ๋Œ€ํ•ด TwoGenerators Drop ๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•˜๋„๋กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์ด์ƒ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” impl Drop for Pinned<TwoGenerators> ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ "Drop ๊ตฌํ˜„์€ ์ „๋ฌธํ™” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค"๋ผ๋Š” ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜์ด๋ฅผ ๊ฑฐ๋ถ€ํ•˜์ง€๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IMO๋Š” ์ƒˆ๋กœ์šด ํŠน์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— PinDrop ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์ œ ํ–ฅํ›„ ํ™•์žฅ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ธฐ๋ณธ ํ•„๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ Pinned<Struct> ์—์„œ Pinned<Field> ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ธฐ๋ณธ &pin T ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ธฐ์กด ์„ค๊ณ„์˜ ์ œ์•ˆ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜์˜ ์ด์ƒ์ ์ธ "์ตœ์ข… ๊ฒŒ์ž„"์€ ๊ทธ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์–ธ์  ๊ฐ€ ์‹ค์กด ์  ์ˆ˜๋ช…์„ ํฌํ•จํ•˜์—ฌ "๋„ค์ดํ‹ฐ๋ธŒ"๋ถ€๋™ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ๋” ๊ทน์ ์ธ (๊ตฌํ˜„ํ•˜๊ธฐ ๋” ๋ณต์žกํ•œ) ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒƒ :

struct SelfReferential {
    foo: i32,
    ref_to_foo: &'foo i32,
}

์ด๋Ÿฌํ•œ ์œ ํ˜•์€ !Sized ๋“ฑ์—์„œ Pinned<T> ์™€ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. [1] ๊ทธ๋Ÿฌ๋‚˜ Pinned ์™€๋Š” ๋‹ฌ๋ฆฌ ์ดˆ๊ธฐ ์ด๋™ ๊ฐ€๋Šฅ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ๊ฐ’, ๊ตฌ์กฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋ฐ ๊ธฐํƒ€ ๋‹ค์–‘ํ•œ ์œ„์น˜์—์„œ ๊ณ ์ • ๋œ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜๋Š” "๋ณด์žฅ ๋œ ๋ณต์‚ฌ ์ œ๊ฑฐ"๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์ œ์ž๋ฆฌ์—์„œ ๊ตฌ์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜์žˆ์„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ

let sr = SelfReferential { foo: 5, ref_to_foo: &sr.foo };

(์ด๋ฏธ ์ผ์ข…์˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค) ... ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

fn make_self_referential() -> SelfReferential {
    let sr = SelfReferential { foo: 5, ref_to_foo: &sr.foo };
    sr
}

๋˜๋Š”

let sr: Box<SelfReferential> = box SelfReferential { foo: 5, ref_to_foo: &sr.foo };

๋ฌผ๋ก  ์œ„์˜ ๋‚ด์šฉ์€ ๊ธฐ๋Šฅ์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์— ๋Œ€ํ•œ ๋งค์šฐ ๋Œ€๋žต์ ์ธ ์Šค์ผ€์น˜ ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ๊ตฌ๋ฌธ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ตฌ๋ฌธ์€ ๊ธฐ๋Šฅ ์„ค๊ณ„์™€ ๊ด€๋ จ๋œ ๋งŽ์€ ๋ณต์žก์„ฑ ์ค‘ ๊ฐ€์žฅ ์ ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์ฆ‰, ๋ณต์žก์„ฑ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ™•์‹  ํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ ํ•  ์ˆ˜์—†๋Š” ์ผ๊ด€๋˜์ง€ ์•Š์€ ์•„์ด๋””์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.)

๋‚˜๋Š” ๊ธฐ์กด์˜ Pin ๋””์ž์ธ ๋Œ€์‹ ์— !DynSized -ish ๋””์ž์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๋™๊ธฐ์˜ ์ผ๋ถ€๋กœ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” &'a Pinned<T> ๊ฐ€ ํฌ์ธํ„ฐ ์œ ํ˜•์˜ ์กฐํ•ฉ ํญ๋ฐœ์„ ํ”ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ Pin<'a, T> ๋ณด๋‹ค ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ๋ฌธ์ œ ์ค‘ ์ผ๋ถ€๋ฅผ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค.

  1. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ดˆ๊ธฐ ์ด๋™ ๊ฐ€๋Šฅ ์ƒํƒœ๊ฐ€์—†๋Š” ์œ ํ˜•์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  2. ์‹œ๋„๋Ÿฝ๊ณ  ํ˜ผ๋ž€์Šค๋Ÿฝ๊ณ  (๋™์ผํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ณ ์ • ๋œ ์ฐธ์กฐ์™€ ๊ณ ์ •๋˜์ง€ ์•Š์€ ์ฐธ์กฐ์˜ ์ฐจ์ด์ ์€ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค), ๊ณ ์ • ๋œ ์œ ํ˜•์€ 2 ๋“ฑ๊ธ‰์œผ๋กœ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๋‚˜๋Š” ์›€์ง์ผ ์ˆ˜์—†๋Š” ์ž๊ธฐ ์ฐธ์กฐ ์œ ํ˜•์ด ๋ณธ์งˆ์ ์œผ๋กœ ์œ ์šฉํ•˜๊ณ  ์ž๊ธฐ ์ฐธ์กฐ ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์‰ฝ๊ณ  ์ผ๋ฐ˜์ ์ธ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ์˜จ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ Rust๋ฅผ ๋” ์ž˜ ๋ณด์ด๊ฒŒ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๊ณ  ์ˆ˜์ค€์œผ๋กœ ๋Š๊ปด์ง€๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋ฏธ๋ž˜์—๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๊ณ ์ • ์œ ํ˜•์ด ๋‘ ๋ฌธ์ œ๋ฅผ ๋ชจ๋‘ ํ•ด๊ฒฐํ•  ๊ฒƒ์ด๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” "ํ•€"์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ( Pinned ์—๋Š” ์—ฌ์ „ํžˆ ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์‚ฌ ์ œ๊ฑฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ณ  ์ดˆ๊ธฐ ์ด๋™ ๊ฐ€๋Šฅ ์ƒํƒœ๊ฐ€ ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๊ฒฝ์šฐ) ์ด์™€ ๋Œ€์กฐ์ ์œผ๋กœ Pin ๋Š” a "์•„์ง ๊ณ ์ •๋˜์ง€ ์•Š์€"์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ํŠน์„ฑ์˜ ๋””์ž์ธ์œผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด์žฅ ๋œ &pin ๋Š” ๊ทธ๊ฒƒ์„ ์–ธ์–ด๋กœ ๊ตฌ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ์œ„์˜ Pinned ๋””์ž์ธ์— ๋Œ€ํ•œ ํ”Œ๋ ˆ์ด ๊ทธ๋ผ์šด๋“œ ๋งํฌ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

[1] ... ์ •์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์ง€๋งŒ ์›€์ง์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์›€์ง์ด์ง€ ์•Š์„ ์ˆ˜๋„์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ํŠน์„ฑ ReallySized (๋œ ์–ด๋ฆฌ์„์€ ์ด๋ฆ„)์„ ์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์–ด์จŒ๋“  ์—ฌ๊ธฐ์—์„œ ์•ฝ๊ฐ„์˜ ๋ณ€๋™์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ rvalue์— ๋Œ€ํ•œ ์ง€์›์„ ํ†ตํ•ด ํ˜„์žฌ Sized ์ธ์ˆ˜๋ฅผ๋ฐ›๋Š” ๋งŽ์€ ํ•จ์ˆ˜๊ฐ€ ํฌ๊ธฐ๊ฐ€ ์กฐ์ •๋˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด๋™ ๊ฐ€๋Šฅํ•œ ์ธ์ˆ˜์™€ ์ž˜ ์ž‘๋™ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ํ•จ์ˆ˜์˜ ๊ฒฝ๊ณ„์™€ ํ–ฅํ›„ ํ•จ์ˆ˜์— ์‚ฌ์šฉํ•  ๊ฒฝ๊ณ„์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์„ ๋ชจ๋‘ ๋ณ€๊ฒฝํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋น„๋ก ์ด๊ฒƒ์ด ๋ช‡ ๊ฐ€์ง€ ๋‹จ์ ์ด์žˆ์„์ง€๋ผ๋„, ํ–ฅํ›„ ์—๋””์…˜์—์„œ ํ•จ์ˆ˜ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ (๋ฌต์‹œ์ ) ๊ฒฝ๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค.

[ํŽธ์ง‘ : ๊ณ ์ • ์ฝ”๋“œ ์˜ˆ์ œ]

๋ฟก๋ฟก

ํด๋กœ์ € ๊ธฐ๋ฐ˜ ์Šคํƒ ๊ณ ์ • API๊ฐ€ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ, ๋” ์ธ์ฒด ๊ณตํ•™์ ์ด๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ํ™•์ธ๋˜๋Š” ๋ฏธ๋ž˜์˜ ๊ธธ (ํ•œ ๋ฒˆ & pin์€ ์–ธ์–ด ๊ธฐ๋ณธ ์š”์†Œ)์ด ์žˆ์Šต๋‹ˆ๋‹ค. @cramertj๊ฐ€ ์ œ์•ˆํ•œ ๋งคํฌ๋กœ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋กœ์ € ๊ธฐ๋ฐ˜์€ async / await์—์„œ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋กœ์ € ๋‚ด์—์„œ ์–‘๋ณด ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งคํฌ๋กœ ๊ธฐ๋ฐ˜์€ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ์ •๋ง ์•ˆ์ „ํ•˜๋‹ค๋ฉด ๊ฝค ๋…์ฐฝ์ ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„๊ฐ€ ๋–จ์–ด์ง€๋Š” ๋™์•ˆ ํŒจ๋‹‰์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ˆ„์ถœ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ MIR๋กœ ํ•ด๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

๋˜ํ•œ "๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น ํ•ด์ œ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ์†Œ๋ฉธ์ž"๋ณด์žฅ๊ณผ ๊ณ ์ • ๋œ ํ•„๋“œ๋ฅผ ํˆฌ์˜ํ•˜๋Š” ๊ธฐ๋Šฅ ์‚ฌ์ด์˜ ์ƒํ˜ธ ์ž‘์šฉ์— ๋Œ€ํ•ด์„œ๋„ ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์œ„ ๋“œ๋กญ์ด ๋‹นํ™ฉํ•˜๋ฉด ๊ฐ’์— ๊ณ ์ • ๋œ ํ•„๋“œ๊ฐ€ ๋“œ๋กญ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Rust ๋†€์ดํ„ฐ์—์„œ๋Š” ์‹ค์ œ๋กœ ์ตœ์ƒ์œ„ ์œ ํ˜•์˜ ํŒจ๋‹‰ ํ›„์—๋„ ์œ ํ˜•์˜ ํ•„๋“œ๊ฐ€ ์–ด์จŒ๋“  ๋–จ์–ด์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ ๋ณด์ฆ์€ ์‹ค์ œ๋กœ ์–ด๋””์—๋‚˜ ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ์Šคํƒ ๊ณ ์ •์ด ํ•€ ํ”„๋กœ์ ์…˜๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (์ฆ‰, PinDrop๊ณผ ๊ฐ™์€ ๋” ๋ฌด๊ฑฐ์šด ๋ฌด์–ธ๊ฐ€๊ฐ€ ํ•ญ์ƒ ํŒจ๋‹‰ ์ƒํƒœ์—์„œ ์ค‘๋‹จ๋˜๋ฏ€๋กœ Drop๊ณผ PinDrop๊ฐ„์— ๊ธฐ๋Šฅ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).

Vec ์šฉ impl Unpin์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์œ ๋Š”์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€๋งŒ ์›์‹œ ํฌ์ธํ„ฐ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ๋‹น์‹ ์˜ ์š”์ ์„ ๋ด…๋‹ˆ๋‹ค : ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์†Œ์œ  ํ•œ Vec<T> ํ•„๋“œ์—์„œ ์ž๋™ !Unpin ๊ตฌํ˜„์— ์˜์กดํ•˜๊ณ  ํŠน์ • !Unpin T ๋Œ€ํ•ด ๊ณ ์ •์ด ์ „ ์ด์ ์ด๋ผ๊ณ  ๊ฐ€์ • ํ•œ ์ž์ฒด ์ ‘๊ทผ์ž๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค PinMut<Vec<T>> ๊ฐ€ ์‹ค์ œ๋กœ PinMut<T> ๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ์—ฌ์ „ํžˆ PinMut::deref ๋ฅผ ์ด์šฉํ•˜์—ฌ ์›์‹œ ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ ธ ์™€์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ€์ •์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๊ฐ€ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ Vec (๋˜๋Š” ๋ฌด์—‡์ด๋“ )์„ ํ†ตํ•ด ์ „์ด๋˜๋Š” !Unpin ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ƒํ™ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ถ€์ •์ ์ธ ์ถ”๋ก ์— ๋Œ€ํ•œ ๊ทธ๋Ÿฐ ์ข…๋ฅ˜์˜ ์˜์กด์€ ์–ด์จŒ๋“  ๋‚˜์—๊ฒŒ๋Š” ์ˆ˜์ƒ ์ฉ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค. !Unpin ์ด๊ณ  T ๊ฐ€ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ํ•ญ์ƒ PhantomData<T> ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด ์ธ์ˆ˜๋Š” ์›์‹œ ํฌ์ธํ„ฐ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค). "ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์œ ํ˜•์ด ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๊ด€๊ณ„์—†์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ ๊ณ ์ • ํ•ด์ œ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์€ UB์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์ด ๋ช…์‹œ ์ ์œผ๋กœ ์˜ตํŠธ ์•„์›ƒํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ๋ฌธ์„œ์—์„œ ์ด๊ฒƒ์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ ์–ธํ•˜์ง€ ์•Š๋Š” ํ•œ"์ด๋ฉด ์ถฉ๋ถ„ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋งคํฌ๋กœ ๊ธฐ๋ฐ˜์€ ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค. ์ •๋ง ์•ˆ์ „ํ•˜๋‹ค๋ฉด ๊ฝค ๋…์ฐฝ์ ์ž…๋‹ˆ๋‹ค. ๋ฒ”์œ„๊ฐ€ ๋–จ์–ด์ง€๋Š” ๋™์•ˆ ํŒจ๋‹‰์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ˆ„์ถœ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ MIR๋กœ ํ•ด๊ฒฐ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ?

panic-during-drop์œผ๋กœ ์ธํ•ด ๋‚˜๋จธ์ง€ ์ง€์—ญ ๋ณ€์ˆ˜์˜ ๋“œ๋กญ์„ ๊ฑด๋„ˆ ๋›ฐ๋Š” ๊ฒƒ์€ MIR์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ "๋ณดํ†ต ๋‚™ํ•˜"์—์„œ "ํ’€๋ฆฐ ๋‚™ํ•˜"๋กœ ์ „ํ™˜๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋˜ ๋‹ค๋ฅธ ํŒจ๋‹‰์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋ฟก๋ฟก

panic-during-drop์œผ๋กœ ์ธํ•ด ๋‚˜๋จธ์ง€ ์ง€์—ญ ๋ณ€์ˆ˜์˜ ๋“œ๋กญ์„ ๊ฑด๋„ˆ ๋›ฐ๋Š” ๊ฒƒ์€ MIR์˜ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ "๋ณดํ†ต ๋‚™ํ•˜"์—์„œ "ํ’€๋ฆฐ ๋‚™ํ•˜"๋กœ ์ „ํ™˜๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋˜ ๋‹ค๋ฅธ ํŒจ๋‹‰์ด ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

๋“œ๋กญ๋˜๋Š” ๊ตฌ์กฐ์˜ ๋‹ค๋ฅธ ํ•„๋“œ๊ฐ€์ด ์ปจํ…์ŠคํŠธ์—์„œ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž๊ฐ€ ์ง๋ฉด ํ•œ ๋ฌธ์„œ์—์„œ๋Š”์ด ์‚ฌ์‹ค์ด ๋ถ„๋ช…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ๊ท€ํ•˜๊ฐ€ ๋งํ•˜๋Š” ์ „์ฒด ๋ณด์ฆ์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฌธ์ œ ์ถ”์ ๊ธฐ์—์„œ ์ˆ˜์ •ํ•ด์•ผํ•˜๋Š” ๋ฒ„๊ทธ๋กœ ๊ฐ„์ฃผ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ์‹ค ๋งŒ ์•Œ๊ฒŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค).

@comex

Pinned (๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (Rust๊ฐ€ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ท„๋‹ค๋ฉด) ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์ด ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ์™€ ์—ญ ํ˜ธํ™˜ :

type PinMut<'a, T> = &'a mut Pinned<T>;
type Pin<'a, T> = &'a Pinned<T>;

( Pin ์—์„œ Pinned ๊นŒ์ง€ deref ๊ตฌํ˜„์ด ์ œ์•ˆ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค). ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์€ ๊ณณ์„ ๋ณด๋Š” ๊ฒƒ์€ ์œ ์ตํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :

impl Drop for Pinned<TwoGenerators>

PinMut ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ ์–ด๋„ ๊ฐ„๋‹จํ•˜์ง€๋Š” ์•Š์Œ). Pinned ์œ ํ˜•์ด ์ƒ์„ฑ ๋  ๋•Œ TwoGenerators ์ž์ฒด์˜ Drop ๋Œ€์‹  TwoGenerators Pinned ์œ ํ˜•์ด ์ƒ์„ฑ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋”๋ผ๋„ (์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๊นŒ?) Rust๋Š” ์—ฌ์ „ํžˆ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ์…˜ ๋œ ๋ชจ๋“  ํ•„๋“œ์— ๋Œ€ํ•ด ์ƒ์„ฑ์ž์˜ Pinned ๋ฒ„์ „์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ๋Š” ๊ฐ’์œผ๋กœ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์†Œ๋ฉธ์ž์˜ ๊ณ ์ • ๋œ ๋ฒ„์ „์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ์‚ฌ์šฉ ๋˜์—ˆ๋‹ค๋ฉด ์ด๊ฒƒ์€ ์ด์ƒํ•œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” PinDrop ์™€ ์‹ค์งˆ์ ์œผ๋กœ ๋™์ผํ•˜๋ฉฐ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ’์ด Pinned ์— ๋ฟŒ๋ฆฌ๋ฅผ๋‘๊ณ  ์žˆ๋Š”์ง€ ์žฌ๊ท€ ์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ ์ž์‹ ์˜ ์†Œ๋ฉธ์ž๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์€ ์œ ํ˜น์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’๋ณ„ ํŠน์„ฑ ๊ฐœ์ฒด๋ฅผ ํ—ˆ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ปดํŒŒ์ผ ํƒ€์ž„์— Pinned<T> ๋“œ๋กญ ๋˜๋Š” T ๋“œ๋กญ์„ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋ฐ˜๋“œ์‹œ ์˜์กด ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ Pinned ๋ฒ„์ „์— ๋Œ€ํ•ด ๋ณ„๋„์˜ vtable ํ•ญ๋ชฉ์ด์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ? ์ด ์•„์ด๋””์–ด๋Š” ๋‚˜์—๊ฒŒ ์ผ์ข…์˜ ํฅ๋ฏธ ๋กญ๋‹ค. ํ™•์‹คํžˆ ์ƒ๋‹นํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์ด ํ•„์š”ํ•˜์ง€๋งŒ (์ œ์•ˆ ๋œ PinDrop ๋ณด๋‹ค ํ›จ์”ฌ ๋”), ์–ด๋–ค๋ฉด์—์„œ๋Š” ์ „๋ฐ˜์ ์œผ๋กœ ๋” ์ข‹์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ๋‹ค์‹œ ์ฝ์œผ๋ฉด ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ์„ ๊ธฐ์–ตํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ • ๋œ ์œ ํ˜•์— ๋Œ€ํ•œ deref ๊ตฌํ˜„์€ Pinned<T> ์‹ค์ œ๋กœ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( deref ๊ตฌํ˜„์ด on PinMut ์€ ์–ด๋–ค๋ฉด์—์„œ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ž˜๋ชป ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ณ„์† ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ํŽธ๋ฆฌํ•จ์„ ๊ฐ์•ˆํ•  ๋•Œ ์†์‹ค์„ ์ •๋‹นํ™”ํ•˜๋Š” ๊ฒƒ์€ ์ •๋ง ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํ•œ ๋ฌด๋ฆฌ์˜ ์œ ํ˜•์„ ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๋Š” ํ•œ Unpin ์–ด์จŒ๋“ ). ํŠนํžˆ, RefCell ์˜ˆ์ œ๊ฐ€ Pinned::deref ์กด์žฌํ•˜๋ฉด ๊ธฐ์กด ์œ ํ˜•์œผ๋กœ ๊ณ ์ •์„ ๋™์ ์œผ๋กœ ์ ์šฉ ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ ์ƒ๋‹นํžˆ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ „๋ฌธํ™”๊ฐ€ ์ถฉ๋ถ„ํ•˜๋‹ค๋ฉด). ์ด๊ฒƒ์€ ๋” ์šฐ๋ฆฌ๊ฐ€ ์œ ์ง€ํ•˜๋Š” ๊ฒฝ์šฐ ์ œ์•ˆ deref ๊ตฌํ˜„์„, ์šฐ๋ฆฌ๋Š” ๊ฑฐ์˜ ๋งŽ์ด์™€ API ํ‘œ๋ฉด์„ ๋ณต์ œ ๋๋‚ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค Pinned ์šฐ๋ฆฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Pin ; ๋ณด๊ด€ํ•˜์ง€ ์•Š์œผ๋ฉด Pinned<T> ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ์—„์ฒญ๋‚˜๊ฒŒ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค. ๋˜ํ•œ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์•„ Box<Pinned<T>> ์šฐ๋ฆฌ๋Š” ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ?Move ๋ณ„๋„๋กœ ?DynSized (์Šค๋ ˆ๋“œ์—์„œ ๋พฐ์กฑํ•œ ์•„์›ƒ ๋“ฑ).

์ด ๋ชจ๋“  ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ํ˜„์žฌ Rust์˜ ๋งฅ๋ฝ์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ๋‚˜์—๊ฒŒ ๋งค๋ ฅ์ ์ด์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํ˜„์žฌ Rust์˜ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ?Move ๊ฒฝ๊ณ„๋ฅผ ๊ฐ–์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋•Œ (๊ฒฐํ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค) deref ์˜ ์œ ํ˜•์ด Unpin ์ด ์•„๋‹ˆ๋ฉด Pinned ๊ฒฝ์šฐ ์ด์ ์ด์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ •๋ง ์•„ํ”Œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์†Œ์œ  ์žฌ์‚ฐ์„ ๊ณ ์ •ํ•จ์œผ๋กœ์จ ์‹ค์ œ๋กœ ์ผ์–ด๋‚˜๋Š” ์ผ์„ ๋” ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ฐจ๋ก€๋กœ PinMut::deref ์™€ ๊ฐ™์€ ์ž„์‹œ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ณ  ํ›จ์”ฌ ๋” ์ฆ๊ฑฐ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ ๋‹ค (์ฃผ๊ด€์ ์œผ๋กœ ์–ด์จŒ๋“ ) ,ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์–ธ์–ด ๊ธฐ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํŠนํžˆ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค (์ œ์•ˆํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๋ถ€๋™ ์œ ํ˜•์— ๋น„ํ•ด). ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ์™„์ „ํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” (๋Œ€๋ถ€๋ถ„ ํ•€ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋“œ๋กญ ๊ตฌํ˜„์„ ํ˜ธ์ถœ) ์–ป์„ ์ˆ˜์—†๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๊ทธ๋ ‡๊ฒŒ ์œ ์šฉํ•œ ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์ด ๊ณ ์ • ๋œ ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์†Œ๋ฉธ์ž์—์„œ ๋ถ„๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.) ๋”ฐ๋ผ์„œ์ด ์‹œ์ ์—์„œ PinMut ์ œ์•ˆ์„ ๋ณ€๊ฒฝํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–ด์ฉŒ๋ฉด ์ •๋ง ๋งค๋ ฅ์ ์ธ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pinned (๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ)์— ๋Œ€ํ•œ ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (Rust๊ฐ€ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ท„๋‹ค๋ฉด) ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์ด ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ์™€ ์—ญ ํ˜ธํ™˜ :

type PinMut<'a, T> = &'a mut Pinned<T>;
type Pin<'a, T> = &'a Pinned<T>;

์šฐ์„ , Pinned ์ž์ฒด๋Š” "๊ธฐ๋Šฅ"์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์†Œํ•œ์˜ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์„ ํ•„์š”๋กœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DynSized ๋ฐ ๊ด€๋ จ ํŠน์„ฑ๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋””์ž์ธ์„ ์˜๋ฏธํ•œ๋‹ค๋ฉด ์œ ํšจํ•˜์ง€๋งŒ ...

์˜ˆ๋ฅผ ๋“ค์–ด Pin<'a, T> ๋ฐ &'a T ๋ชจ๋‘์— ๋Œ€ํ•ด ๋™์ผํ•œ ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์‹œ๋„ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐ‘์ž๊ธฐ ์ถฉ๋Œํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ œ์•ˆํ•œ ๋‚ด์šฉ์€ ์‹ค์ œ๋กœ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ API ๋””์ž์ธ์—๋Š” ์ƒ๋‹นํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Pin ์‚ฌ์šฉํ•˜๋ฉด ์ด๋™ ๋ถˆ๊ฐ€๋Šฅํ•œ ์œ ํ˜•์— ์˜ํ•ด impl'ed ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ํŠธ๋ ˆ์ด ํŠธ์˜ ๋ฉ”์„œ๋“œ๋Š” PinMut<Self> ๋ฅผ ๊ฐ€์ ธ์•ผํ•˜๊ณ , ๋ถ€๋™ ์œ ํ˜•์„ ์ฐธ์กฐํ•˜๋ ค๋Š” ์ผ๋ฐ˜ ํ•จ์ˆ˜๋Š” fn foo<T>(p: PinMut<T>) ์™€ ๊ฐ™์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Pinned ๋””์ž์ธ์€ Pinned<MyStruct> ๋Œ€ํ•œ ํŠน์„ฑ์„ ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ํŠน์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ:

  1. ์›€์ง์ผ ์ˆ˜์—†๋Š” ์œ ํ˜•์€ ๋ฉ”์„œ๋“œ๊ฐ€ &self ๋˜๋Š” &mut self ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ํŠธ๋ ˆ์ด ํŠธ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์„ฑ๊ธฐ๋Š” Iterator ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์กด ํŠน์„ฑ๊ณผ ๋™์ผํ•˜์ง€๋งŒ ๋Œ€์‹  PinMut<Self> ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ๋กœ์šด ํŠน์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  PinMut<T> ๋ฅผ &mut Pinned<T> PinMut<T> ์˜ ๋ณ„์นญ์œผ๋กœ ๋งŒ๋“ค๋ฉด ๋Œ์•„๊ฐ€์„œ ๋ชจ๋“  ์ค‘๋ณต ํŠน์„ฑ์„ ํ๊ธฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๊ฝค ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ค‘๋ณต์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  2. ๋ฐ˜๋ฉด์— ์ƒˆ๋กœ ์„ค๊ณ„๋˜๊ฑฐ๋‚˜ ์ƒ์„ฑ์ž ๋ณ„ ํŠน์„ฑ์€ ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์›€์ง์ผ ์ˆ˜์—†๊ณ  ํ•„์š”ํ•˜์ง€ ์•Š์€ ์œ ํ˜•์— ๋Œ€ํ•ด ๋…ธ์ด์ฆˆ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋น„์šฉ์œผ๋กœ PinMut<Self> ๋ฅผ ์œ ์ผํ•œ ์˜ต์…˜์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. (๊ตฌ์ฒด์ ์œผ๋กœ ๋ฐœ์‹ ์ž๋Š” &mut self ์—์„œ PinMut<Self> PinMut::new ๋กœ ์ด๋™ํ•˜๋ ค๋ฉด Self: Unpin ๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.) Pin<T> ๊ฐ€ &mut Pinned<T> ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ์†Œ์Œ์„ ์ œ๊ฑฐ ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ๊ตฌ์ƒํ•˜๊ณ ์žˆ๋Š” ๋ฏธ๋ž˜์˜ ๊ธฐ๋ณธ ๊ณ ์ •ํ˜•์€ ์ด๋™ํ˜• ์œ ํ˜•๊ณผ ๋™์ผํ•œ ์ƒํ™ฉ์—์žˆ์„ ๊ฒƒ์ด๋ฉฐ, ํ•ญ์ƒ ๊ณ ์ • ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ๋  ๋•Œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ Pinned ๋กœ ๋ž˜ํ•‘ ๋  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋จธ์ง€ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•ด์„œ๋Š” ๋‘ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋‹ต๋ณ€ ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

Drop

Drop ์— ๋Œ€ํ•ด ๋ง์”€ํ•˜์‹  ๋‚ด์šฉ์— ์•ฝ๊ฐ„ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์ง€๋งŒ PinMut ์™€ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ๋งŒ๋“ค๋ ค๊ณ ํ•˜๋Š” ์ •๋„์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ์ ‘๊ทผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ TwoGenerators ์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. TwoGenerators ๋˜๋Š” Pinned<TwoGenerators> ๋Œ€ํ•œ ์ˆ˜๋™ Drop impl ์—†์Œ;
  2. ๋‹น์‹ ์€ IMPL Drop ์— ๋Œ€ํ•ด Pinned<TwoGenerators> ; ํ•œํŽธ, ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋™์ผํ•œ ๋งคํฌ๋กœ๋Š” TwoGenerators ์ž์ฒด์— ๋Œ€ํ•ด Drop impl์„ ์ƒ์„ฑํ•˜์—ฌ self๋ฅผ &mut Pinned<TwoGenerators> ํ•˜๊ณ  ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค : &mut T ๋ฅผ &mut Pinned<T> ๋กœ ์บ์ŠคํŠธํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ถˆ๋ณ€์„ฑ์€ ๋Œ€์—ฌ๊ฐ€ ๋๋‚œ ํ›„ T ์ด๋™ํ•˜์ง€ ์•Š๊ณ  Drop , ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•ด ์ƒ์„ฑ ๋  ๋งˆ์ง€๋ง‰ ์ฐจ์ž…๊ธˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค.)

๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด์žˆ๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ตฌ์กฐ์ฒด๊ฐ€ Drop ์„ (๋ฅผ) ๋‹จ์ˆœํ™”ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. impl์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ตฌ์กฐ์ฒด๋Š” ์ฐจ์šฉ ๊ฒ€์‚ฌ๊ธฐ์— ์˜ํ•ด ๋” ๋Š์Šจํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ณ ์ • ๋œ ์ƒํƒœ์™€ ๊ณ ์ •๋˜์ง€ ์•Š์€ ์ƒํƒœ์— ๋Œ€ํ•ด ์‹ค์ œ ๋ณ„๋„์˜ ์†Œ๋ฉธ์ž๋ฅผ ์›ํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ์ด๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด vtable์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

RefCell

Pinned::deref ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ๋งคํฌ๋กœ ์ƒ์„ฑ ํ•„๋“œ ์ ‘๊ทผ์ž๋Š” ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด "๋†€๋ผ ์šธ ์ •๋„๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค"๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ํ•„๋“œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋œ ์ข‹์ง€๋งŒ ์–ธ์  ๊ฐ€๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๊ณ ์ • ๊ตฌ์กฐ์— ์˜ํ•ด ์ˆ˜์ • ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด Pin ์—๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋ฉด RefCell ๋ฌธ์ œ๊ฐ€ ๋ฐฉ์ง€๋ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ํ˜„์žฌ Rust์˜ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋„ ?Move ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•  ๋•Œ (deref๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์ •๋ง ์ƒ์ฒ˜๋ฅผ ์ค„ ๊ฒƒ์ž…๋‹ˆ๋‹ค [..])

๋ฐ˜๋Œ€๋กœ ?Sized ๋ฐ”์šด๋“œ๊ฐ€์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ์•”์‹œ ์ ์œผ๋กœ ?Move ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ?Sized ๋ฐ”์ธ๋”ฉ ๋œ ์ฝ”๋“œ๊ฐ€ ์ด๋™์„ฑ์„ ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์˜ˆ์™ธ๋Š” size_of_val ๋ฅผ ํ˜ธ์ถœ ํ•œ ๋‹ค์Œ memcpy๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ size_of_val ๊ฐ€ ์›€์ง์ผ ์ˆ˜์—†๋Š” ์œ ํ˜•์— ๋Œ€ํ•ด ํŒจ๋‹‰์„ ์ผ์œผํ‚ฌ ์ˆ˜์žˆ๋Š” ํ•ดํ‚น์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ๊ฒฝ๊ณ„).

Drop์— ๋Œ€ํ•ด ๋ง์”€ํ•˜์‹  ๋‚ด์šฉ์ด ์•ฝ๊ฐ„ ํ˜ผ๋ž€ ์Šค๋Ÿฝ์ง€๋งŒ PinMut๊ณผ ์—ญ ํ˜ธํ™˜์ด ๊ฐ€๋Šฅํ•˜๋„๋กํ•˜๋ ค๋Š” ์ •๋„๊นŒ์ง€๋Š” ์ข‹์€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. .

๋‚˜๋Š” ๋ฌด์–ธ๊ฐ€ ๊ฐ€ PinMut ๊ณผ ํ˜ธํ™˜ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ์— ๋Œ€ํ•œ ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ Pinned<T> (ํ˜„์žฌ Rust์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Œ)์—์„œ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ PinDrop ์™€ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ, ์ €๋Š” Drop ์ „๋ฌธํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ๋ชจํ˜ธํ•œ ์„ ๋ก€๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ณ ์ •๊ณผ ๊ด€๋ จ์ด์—†๋Š” ์ด์œ ๋กœ ๊ฑฐ์˜ ํ™•์‹คํžˆ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” ์ด๋Ÿฐ ๋ณธ์งˆ์ ์ธ ์ด์ ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  PinDrop ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ œ์•ˆ๊ณผ ๋ถ„๋ฆฌ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋ฉด Pin๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. PinMut::deref ์ œ๊ฑฐ ํ•  ์˜ํ–ฅ์ด ์žˆ๋‹ค๋ฉด RefCell ์™€ ๊ฐ™์€ ์œ ํ˜•์œผ๋กœ๋„ ๋ฉ‹์ง€๊ฒŒ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ฐจ์ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง„ ์†”๋ฃจ์…˜์„ ํ•จ๊ป˜ ์ž๊ฐˆ ์—ฌ์ „ํžˆ ์ˆ˜ PinMut ์ง€์›ํ•˜๋ฉด์„œ deref ํ•˜์ง€ ์ž‘์—…์— ๋ณด์ธ๋‹ค, Pinned . ์šฐ๋ฆฌ๊ฐ€ ์ œ๊ฑฐํ•œ๋‹ค๋ฉด deref ๊ตฌํ˜„, ๋‚˜๋Š” ํ›จ์”ฌ ๋” ๊ฐ€๋Šฅ์„ฑ์ด์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ๋™์˜ ํ•  ์ƒ๊ฐ Pinned ์˜๋ฏธ์žˆ๋Š” ์ด์ ์„ ์ œ๊ณตํ•œ๋‹ค.

ํ•˜์ง€๋งŒ deref ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ž‘์€ ๋ฌธ์ œ์— ๋ถˆ๊ณผํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์— ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ˜„์žฌ ์ƒํƒœ์—์„œ๋Š” &Pinned<Vec<T>> ๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ T: !Unpin ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ํŠน์ •ํ•œ ์ข…๋ฅ˜์˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ Unpin ์ž‘๋™ ๋ฐฉ์‹์—์„œ ๋น„๋กฏ๋œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ƒํƒœ๊ณ„๋Š” ์ด์ฒด์ ์œผ๋กœ impl Deref for Pinned<Vec<T>> { type Target = Pinned<[T]>; } ๋˜๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•ด์•ผํ•˜๋Š”๋ฐ, ์ด๊ฒƒ์ด ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด impl PinDeref<Vec<T>> ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. deref ์—†๋Š” ์„ธ๊ณ„. ์„ธ๊ณ„์—์„œ deref , ๊ฑฐ์˜ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ „ํ˜€ ์–ด๋–ค ํ•€ ๊ด€๋ จ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ  ๋„๋ง, ์—ฌ์ „ํžˆ ์ ˆ๋ฐ˜ ๊ดœ์ฐฎ์€ ์ง€์› ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค !Unpin ์œ ํ˜•.

๋ฐ˜๋Œ€๋กœ,? Sized ๊ฒฝ๊ณ„๊ฐ€์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ์•”์‹œ ์ ์œผ๋กœ? Move์ž…๋‹ˆ๋‹ค.

์•„ ๋„ค, ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„, Rust ์ฝ”๋“œ ์ „์ฒด๊ฐ€ !Sized ๋ฐ”์šด๋“œ ์œ ํ˜•์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ์–ด๋„ ์ผ๋ถ€ ๋Š” ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฐ’์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ ํ•  ์ˆ˜์žˆ๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์€ & ๋˜๋Š” &mut ๋ฉ”์„œ๋“œ (์˜ˆ : ์Šฌ๋ผ์ด์Šค ๋˜๋Š” ํŠน์„ฑ ๊ฐœ์ฒด)๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‹ค์ง€ ์ด์ ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค & Pinned::deref ์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ท€ํ•˜์˜ ์ œ์•ˆ ( Unpin ์œ ํ˜• ์ œ์™ธ)์— ๋”ฐ๋ผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #[derive] ๊ตฌํ˜„์œผ๋กœ Pinned<T> ๋˜๋Š” ๊ทธ ๋ฐ–์˜ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์žˆ์Šต๋‹ˆ๊นŒ?

Drop

๊ฐœ์ธ์ ์œผ๋กœ, ์ €๋Š” Drop์„ ์ „๋ฌธํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ๋ชจํ˜ธํ•œ ์„ ๋ก€๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๊ณ ์ •๊ณผ ๊ด€๋ จ์ด์—†๋Š” ์ด์œ ๋กœ ๊ฑฐ์˜ ํ™•์‹คํžˆ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๋ณธ์งˆ์ ์ธ ์ด์ ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ €๋Š” PinDrop์ด ๋‚˜๋จธ์ง€ ์ œ์•ˆ๊ณผ ๋Œ€๋ถ€๋ถ„ ๋ถ„๋ฆฌ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ชจํ˜ธํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„โ€ฆ ๋‹น์‹ ์ด ์˜ณ๋‹ค๊ณ  ๋งํ•œ ๊ฒƒ์€ ์ „๋ฌธํ™”์˜ ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ž ๊ทธ๋Œ€๋กœ Drop ์˜ ์ผ๋ถ€ ๋ถ€๋ชจ ๋ธ”๋žญํ‚ท impl์„ ์ „๋ฌธํ™”ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์ƒ์„ฑ ํ•œ ๋“œ๋กญ ๊ธ€๋ฃจ๋Š” ๊ตฌํ˜„ ๋œ ๊ฒฝ์šฐ์—๋งŒ Drop ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํŠน์ˆ˜ํ™”์™€ ๋™๋“ฑํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 'userland'๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค ( drop ์ˆ˜๋™์œผ๋กœ ํ˜ธ์ถœ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ฌด์‹œ ํ•จ).

trait DropIfImplemented {
    fn maybe_drop(&mut self);
}
impl<T: ?Sized> DropIfImplemented for T {
    default fn maybe_drop(&mut self) {}
}
impl<T: ?Sized + Drop> DropIfImplemented for T {
    fn maybe_drop(&mut self) { self.drop() }
}

๋”ฐ๋ผ์„œ ํ˜„์žฌ 'ํŠน์ˆ˜ํ™” ๋œ'Drop impls๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜์—†๋Š” ์ด์œ ๋Š” ์ „๋ฌธํ™” ์ž์ฒด๊ฐ€ ํ˜„์žฌ ๋ถˆ์ผ์น˜ ํ•œ ์ด์œ ์™€ ๋™์ผํ•œ ์ด์œ ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. trans (์ˆ˜๋ช… ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์šฐ๋Š”)์™€ typeck (๊ทธ๋ ‡์ง€ ์•Š์€) ์‚ฌ์ด์˜ ๋ถˆ์ผ์น˜์ž…๋‹ˆ๋‹ค. ์ฆ‰, impl Drop for Foo<'static> ๋ผ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด codegen์€ ๋‘ ์œ ํ˜•์ด ๋™์ผํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Foo<'static> ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  Foo<'a> ๋Œ€ํ•ด ์‹ค์ œ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ข‹์€ ์†Œ์‹์€ ์•„๋งˆ ์•Œ๋‹ค์‹œํ”ผ ํŠน์ˆ˜ํ•œ impls๋ฅผ ์ œํ•œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์„œ ๊ทธ๋Ÿฌํ•œ ์œ ํ˜•์˜ ์ผ๊ด€์„ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ „๋ฌธํ™”๋Š” ๊ฒฐ๊ตญ ๊ทธ๋Ÿฌํ•œ ์ œํ•œ๊ณผ ํ•จ๊ป˜ ์ œ๊ณต ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•˜๋ฉด Drop impls์— ๋™์ผํ•œ ๊ทœ์น™์„ ์ ์šฉ ํ•  ์ˆ˜์—†๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ธ์–ด๋ฅผ ์ตœ๋Œ€ํ•œ ์ผ๊ด€์„ฑ์žˆ๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ๊ทธ๋ ‡๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ๋Š” ์ „๋ฌธํ™”์— ๋Œ€ํ•œ ๊ณ ์ •์„ ์ฐจ๋‹จํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ €๋Š” impl Drop for Pinned<MyStruct> โ€“ ๋˜๋Š” ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ˜„์žฌ impl<params> Drop for MyStruct<params> ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์กฐ๊ฑด์—์„œ impl<params> Drop for Pinned<MyStruct<params>> ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ „๋ฌธํ™”์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์˜ค๋Š˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ๋งŒ๋“ค๋ฉด ๊ฒฐ๊ตญ ๋” ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์œผ๋กœ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ๋ถ„๋ฆฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ๋Œ€์‹ ์— ๋ณ„๋„์˜ ํŠน์„ฑ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Unpin

ํ•˜์ง€๋งŒ deref ๊ฐ€์—†๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ๋Š” ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๋ผ๋Š” ๋ฐ ๋™์˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ์ƒํƒœ์—์„œ๋Š” &Pinned<Vec<T>> ๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ T: !Unpin ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์œ ํ˜•์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ ์žˆ๋Š” ํŠน์ •ํ•œ ์ข…๋ฅ˜์˜ ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ Unpin ์ž‘๋™ ๋ฐฉ์‹์—์„œ ๋น„๋กฏ๋œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์–ด ... ์ข‹์•„์š”, ์ œ ์ง„์ˆ ์„ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Pinned::deref ์žˆ์–ด์•ผํ•˜์ง€๋งŒ Unpin ์— ํ•œ์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Move ๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค .

์œ ์ผํ•œ ์ด์œ  Deref IMPL์„ ์œ„ํ•ด PinMut ๋ฌธ์ œ์˜ ์›์ธ RefCell ์ž…๋‹ˆ๋‹ค (๋‹ฌ๋ฆฌ DerefMut IMPL) ๊ทธ๊ฒƒ์€์— ๋ฌถ์—ฌ ์•„๋‹ˆ์—์š” Unpin . ๊ทธ๋ฆฌ๊ณ  ๋ฐ”์šด๋“œ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š๋Š” ์ด์œ ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ &MyImmovableType ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•˜์—ฌ &self ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€๋™ ์œ ํ˜•์ด ํŠน์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  &T ๋“ฑ. &mut self ์—์„œ๋Š” ๊ทผ๋ณธ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ mem::swap ๋˜๋Š” mem::replace ์ด๋™ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„ &self ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. mem::replace โ€“ ์ฆ‰, RefCell ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ถ”๋ก ์€ ๋ถˆ๋ณ€ ์ฐธ์กฐ์— ๋Œ€ํ•œ ์ œํ•œ์ด ์ž„์˜์ ์œผ๋กœ ๋Š๊ปด์ง€๋”๋ผ๋„ ํด๋Ÿฌ์ง€๋ฅผ ์œ ๋ฐœํ•˜๋”๋ผ๋„ ๊ธฐ์กด ์ฐธ์กฐ์™€์˜ ํ˜ธํ™˜์„ฑ์ด ์ง€์›๋˜์–ด์•ผ ํ• ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Pinned ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ์™€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ๋ฅผ ๋ชจ๋‘ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MyStruct ์—์„œ ์ง์ ‘ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Pinned<MyStruct> ์—์„œ ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ ์€ &T ๋ฅผ ์ทจํ•˜์ง€ ๋งŒ ๋ณ„๋„๋กœ Self: Sized ๊ฒฝ๊ณ„๊ฐ€์žˆ๋Š” ํŠน์„ฑ์ด๋‚˜ ํ•จ์ˆ˜์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋“œ๋ฌผ๊ณ  ์ข…์ข… ์˜๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ Pinned ์ž์ฒด๋Š” ์‹ค์ œ๋กœ Unpin ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„๋„๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ์™œ ๋ˆ„๊ตฐ๊ฐ€ ์‹ค์ œ๋กœ &Pinned<Vec<T>> ๊นŒ์š”? PinMut ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํŠน์„ฑ์ด PinMut<Self> ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ด๋™์‹ ์œ ํ˜•์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ํŠน์„ฑ์˜ impl์กฐ์ฐจ๋„ PinMut ๋ฅผ ๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•จ๊ป˜ Pinned ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด, ํŠน์„ฑ์ด ๊ฑธ๋ฆด ๊ณ„์† &self ๋˜๋Š” &mut self , ๋‹น์‹ ์€ ๊ทธ๋“ค์„ IMPL ๊ฒƒ Pinned<MyStruct> . Vec<T> ๋Œ€ํ•ด ๋™์ผํ•œ ํŠน์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๋ ค๋ฉด Pinned ์ด ๊ทธ๋ฆผ์— ๋‚˜์˜ฌ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž ์žฌ์  ์ธ ์†Œ์Šค ์ค‘ ํ•˜๋‚˜๋Š” ํ•„๋“œ ์ ‘๊ทผ ์ž ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด

struct SomePinnable {
    gen: FakeGenerator,
    also_a_vec: Vec<Foo>,
}

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋””์ž์ธ์€ ํ•ญ์ƒ Pinned ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผ์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

impl Pinned<SomePinnable> {
    fn gen(&self) -> &Pinned<FakeGenerator> { โ€ฆ }
    fn gen_mut(&mut self) -> &mut Pinned<FakeGenerator> { โ€ฆ }
    fn also_a_vec(&self) -> &Pinned<Vec<Foo>> { โ€ฆ }
    fn also_a_vec_mut(&mut self) -> &mut Pinned<Vec<Foo>> { โ€ฆ }
}

โ€ฆ ๊ทธ๋ฆฌ๊ณ  ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Pinned ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๊ท€ํ•˜์—๊ฒŒ ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค Unpin / Move ๊ฐ€ ์‹ค์ œ๋กœ ์กด์žฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ๊ดœ์ฐฎ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋Œ€์•ˆ์€ Pinned ๋Œ€์‹  ์ง์ ‘ ์ฐธ์กฐ๋ฅผ ๋ฐ›๊ธฐ ์œ„ํ•ด ํ•„๋“œ๋ณ„๋กœ ์˜ตํŠธ ์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋‹น์‹ ์€

    fn also_a_vec(&self) -> &Vec<Foo> { โ€ฆ }
    fn also_a_vec_mut(&mut self) -> &mut Vec<Foo> { โ€ฆ }

Pinned ๋ฐ ๋น„ Pinned ์ ‘๊ทผ์ž๋ฅผ ๋ชจ๋‘ ๊ฐ–๋Š” ๊ฒƒ์€ ํƒ€๋‹นํ•˜์ง€ ์•Š์ง€๋งŒ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

...ํ•˜์ง€๋งŒ ๊ทธ๋ž˜, ์šฐ๋ฆฌ๊ฐ€ํ•ด์•ผ ํ•  ์•Š๋Š” Move ๊ทธ๋ƒฅ์— ๋Œ€ํ•œ ํŠน์„ฑ, Pinned . ์˜ˆ๋ฅผ ๋“ค์–ด, size_of_val ์˜ ์ƒˆ ๋ฒ„์ „์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„์˜ ์ผ๋ถ€๊ฐ€๋ฉ๋‹ˆ๋‹ค (์ˆ˜์ • : ๊ทธ๋ ‡์ง€๋Š” ์•Š์ง€๋งŒ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋Š” ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ž„์˜์˜ ์œ ํ˜•์„ memcpyํ•˜๊ธฐ ์ „์—์ด๋ฅผ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. / size_of_val ); ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ rvalue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ptr::read ๋ฐ mem::swap ๋ฐ mem::replace ๋Œ€ํ•œ ์ œํ•œ ( Sized ์—์„œ ์™„ํ™”๋จ)์ด๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์šฐ๋ฆฌ๊ฐ€ &move ๋ฅผ๋ฐ›๋Š”๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ํ•˜๋‚˜์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒ ํ•  ์ˆ˜์žˆ๋Š” ํ•œ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด์žฅ ๋œ ๋ณต์‚ฌ ์ œ๊ฑฐ์—๋„ ์œ ์‚ฌํ•œ ๋‚ด์šฉ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํŠน์„ฑ์ด์žˆ๋Š” ํ•œ Pinned::deref (๋ฐ deref_mut )์— T: Move ๋ฐ”์šด๋“œ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

[ํŽธ์ง‘ : pythonesque๊ฐ€ ๋‚˜์—๊ฒŒ ์ƒ๊ธฐ ์‹œ์ผฐ ๋“ฏ์ด, ์ด๊ฒƒ์€ Unpin ์™€ ๋‹ค๋ฅธ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ๋งˆ์‹ญ์‹œ์˜ค.]

(๊ทธ๋ฆฌ๊ณ  Vec ๋ฐ Box ์œ ํ˜•์€ ์š”์†Œ ์œ ํ˜•์ด Move ์ธ์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ ์šฉ๋˜๋„๋ก Move ์ˆ˜๋™์œผ๋กœ impl์„ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์–ด ... ์ข‹์•„์š”, ์ œ ์ง„์ˆ ์„ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Pinned :: deref๋Š” ์กด์žฌํ•ด์•ผํ•˜์ง€๋งŒ Unpin์— ๋ฌถ์—ฌ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ Move๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ข‹์•„์š”, ์ž ์‹œ๋งŒ ์š”. ?Move ๋˜๋Š” Move ์ž…๋‹ˆ๊นŒ? ์ „์ž๋Š” !Unpin ์œ ํ˜•์ด ๋งŽ์€ ๊ฒฝ์šฐ์— ์ƒ์„ฑ ๋  ์ˆ˜๋„ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๋Š” ์ •ํ™•ํžˆ ์–ด๋–ป๊ฒŒ ์šฐ๋ฆฌ๊ฐ€ Pinned<T> ์™€ ๊ฐ™์€ ์œ ํ˜•์„ ์ฐธ์กฐํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค ( ?DynSized ๊ฐ€ ์‹ค์ œ๋กœ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฝ๊ณ„๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—). ๋‚˜๋Š” ๊ทธ๋“ค์ด ํ•˜๋‚˜์ด๊ณ  ๋™์ผํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Move ๋ฅผ Unpin ํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ ํ”ผํ•˜๋ ค๋Š” ์ •ํ™•ํ•œ ์ผ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ƒ์„ฑ๋˜๋Š” ์ˆœ๊ฐ„ ์œ ํ˜•์„ ์›€์ง์ด์ง€ ์•Š๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‹จ์ ์€ & T๋ฅผ ์ทจํ•˜๋Š” ํŠน์„ฑ์ด๋‚˜ ๊ธฐ๋Šฅ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์ง€๋งŒ ๋ณ„๋„๋กœ Self : Sized bound; ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ๋“ค์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋“œ๋ฌผ๊ณ  ์ข…์ข… ์˜๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ›จ์”ฌ ๋” ์‹ค์งˆ์ ์ธ ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.์ด ํŠน์„ฑ์ด๋‚˜ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๊ฐ€ ์‹ค์ œ๋กœ & Pinned์—์„œ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.์˜ค๋Š˜. ๊ทธ๋“ค์€ ๊ทธ๊ฒƒ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์—„์ฒญ๋‚œ ์ˆ˜์˜ ์ถ”๊ฐ€ ํŠน์„ฑ ๊ตฌํ˜„๊ณผ (๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด) ๊ธฐ์กด #[derive] ๊ตฌํ˜„์˜ ์ƒ๋‹นํ•œ ๊ฐœํŽธ์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ๋„ ์ง€๋ถˆํ•ด์•ผํ•˜๋Š” ๋น„์šฉ์ž…๋‹ˆ๋‹ค. !Unpin ์œ ํ˜•์—์„œ ์ž‘๋™ํ•˜๋ ค๋ฉด &Pinned<Self> ๋Œ€ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ๊ตฌํ˜„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฑธ๋ฆด ํŠน์„ฑ์— ๋Œ€ํ•œ (ํ›จ์”ฌ) ๋” ๋‚˜์€ ์ƒํ™ฉ &mut self ๋ณด๋‹ค PinMut ,ํ•˜์ง€๋งŒ ๋” ๋‚˜์œ &self (๋‚˜๋Š” ์ƒ๊ฐํ•œ๋‹ค) ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์ด ๋” ์ •ํ™•ํ•œ ํ•ด๊ฒฐ์ฑ…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค (๊ธฐ์กด Rust ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋งŽ์ง€ ์•Š๋‹ค๋ฉด Pinned ๋ฒ„์ „์ด ๋” ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

Pinned๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ํŠน์„ฑ์ด ๊ณ„์†ํ•ด์„œ & self ๋˜๋Š” & mut self๋ฅผ ์ทจํ•˜๊ณ , ๋‹น์‹ ์€ Pinned

์ด๋ฒˆ์—๋Š” Pinned ๋งŒ์œผ๋กœ Vec ์˜ API ํ‘œ๋ฉด์—์žˆ๋Š” ๋ชจ๋“  ํŠน์„ฑ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค (ํŠนํžˆ ์ผ๋ถ€ ํŠน์„ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—). ์‚ฌ๋ก€๋ณ„๋กœ Deref ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ (์˜ˆ : &Pinned<Vec<T>> ๋ฅผ &[Pinned<T>] ๋กœ ์ด๋™) Vec ์ „์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ์ค‘ ํ•˜๋‚˜๋ฅผ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค Unpin (ํ•€ ํˆฌ์˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ)์ด ํ›จ์”ฌ ๋” ์ •์ƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“ , ๋‘˜ ๋‹ค ์•„๋ฌด๊ฒƒ๋„ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ผ์ด๋ฉฐ, ์›€์ง์ด์ง€ ์•Š๋Š” ๋ฌผ๊ฑด์ด ๊ทธ๋“ค๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋ ค๋ฉด ๊ธฐ์กด ์œ ํ˜•๊ณผ ํŠน์„ฑ ์ „์ฒด์— ๊ฑธ์ณ ๋ณต์ œ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์‹  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ƒ๊ฐํ• ์ˆ˜๋ก Pinned ์†”๋ฃจ์…˜์ด ๋” ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ Pinned<T> ์ƒˆ๋กœ์šด ํŠน์„ฑ ๊ตฌํ˜„์ด ์‹ค์ œ๋กœ ์–ด๋””์— ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š” ๊ฒƒ; ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๊ท€์ฐฎ๊ฒŒํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋” ๋†’์Šต๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ Pinned ์ž์ฒด๋Š” Unpin์ด ์กด์žฌํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ, ์™œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์‹ค์ œ๋กœ & Pinned>?

์ด๋ ‡๊ฒŒํ•˜๋Š” ๋ฐ์—๋Š” ๊ฝค ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๊ณ ์ • ๋œ ์œ ํ˜•์— Vec ๊ฐ€ ์žˆ์Œ). ์นจ์ž… ์ปฌ๋ ‰์…˜์€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋งค์šฐ ์ž์ฃผ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ Pinned ์ฐธ์กฐ๋ฅผ ์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ Unpin ์ž‘๋™ํ•˜๋„๋ก ์„ ํƒํ•ด์•ผํ•œ๋‹ค๋Š” ์ƒ๊ฐ์— ๊ทผ๊ฑฐํ•œ ์ œ์•ˆ์€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Unpin ๋ฐ”์šด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Rust์˜ ์ผ๋ฐ˜ ์ƒํƒœ๊ณ„์— ์˜ตํŠธ ์ธ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์—„์ฒญ๋‚˜๊ฒŒ ํŒŒ๊ดด์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์‚ฌ์‹ค, ๋‚ด๊ฐ€ ์›€์ง์ผ ์ˆ˜์—†๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

PinMut์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํŠน์„ฑ์ด PinMut์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค., ๋”ฐ๋ผ์„œ ์›€์ง์ผ ์ˆ˜์žˆ๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ํŠน์„ฑ์˜ impls์กฐ์ฐจ๋„ PinMut์„ ๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ™•์‹คํ•œ! Pinned ๋ฒ„์ „์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๊ฐ€๋ณ€ ๊ณ ์ • ์ฐธ์กฐ์— ๋Œ€ํ•ด ๊ณ ์œ  ํ•œ ํŠน์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ์˜ ๋ชจ๋“  ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ deref ๊ฐ€์žˆ๋Š” PinMut ๋ณด๋‹ค ๋‚˜์˜๊ฑฐ๋‚˜ ์ค‘๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

๊ณ ์ • ๋œ ์ ‘๊ทผ ์ž์™€ ๊ณ ์ •๋˜์ง€ ์•Š์€ ์ ‘๊ทผ์ž๋ฅผ ๋ชจ๋‘ ๊ฐ–๋Š” ๊ฒƒ์€ ํƒ€๋‹นํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‘˜ ๋‹ค ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ์ˆ˜๋™ ์ ‘๊ทผ์ž๋Š” ๋‚˜์—๊ฒŒ ๋‚˜์œ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ œ์•ˆ์ด ์–ด๋–ป๊ฒŒ ์ ‘๊ทผ ์ž ์ƒ์„ฑ์„ ์•ˆ์ „ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค (๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณ ์ • ๋˜์ง€ ์•Š์€ ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณต unsafe ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ์ œ๊ณต ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?). ๊ทธ๋Ÿฌ๋‚˜ ์•„์‹œ๋‹ค์‹œํ”ผ Move (์‹ค์ œ๋กœ Unpin ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •)ํ•˜๋ฉด ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํŠน์„ฑ์ด์žˆ๋Š” ํ•œ T : Move ๋ฐ”์šด๋“œ์™€ ํ•จ๊ป˜ Pinned :: deref (๋ฐ deref_mut)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ™•์‹คํ•œ. ์—ฌ๊ธฐ์„œ๋Š” !Unpin ์œ ํ˜•์— ๋Œ€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Unpin ์œ ํ˜•์€ PinMut ์—๋„ ๊ตฌ์„ฑ ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋‚ด ๊ด€์ ์—์„œ ๊ด€๋ จ์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ๋„ค๋ฆญ์— ๋Œ€ํ•œ Unpin (๋˜๋Š” Move ) ๊ฒฝ๊ณ„๋Š” ์œ ์พŒํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ด์ƒ์ ์œผ๋กœ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ํ”ผํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋˜, ๊ฐ™์€ ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด : Unpin ์— ์˜ํ•ด ์•”์‹œ๋˜๊ณ  ์–ด๋–ค !Sized ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๋‚ด๊ฐ€ ๋‹น์‹  ๊ฐ™์€ ์กด์žฌ๋กœ ์ทจ๊ธ‰ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โ€ฆํ•˜์ง€๋งŒ ์˜ˆ, ๊ณ ์ • ๋œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋™ ํŠน์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ size_of_val์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„์˜ ์ผ๋ถ€๊ฐ€๋ฉ๋‹ˆ๋‹ค. ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ rvalue๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ptr :: read ๋ฐ mem :: swap ๋ฐ mem :: replace์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„ (Sized์—์„œ ์™„ํ™”๋จ)๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ & move๋ฅผ ์–ป๋Š”๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ํ•œ ๊ณณ์—์„œ ๋ฒ—์–ด๋‚˜๊ฒŒ ํ•  ์ˆ˜์žˆ๋Š” ํ•œ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ณด์žฅ ๋œ ๋ณต์‚ฌ ์ œ๊ฑฐ์—๋„ ์œ ์‚ฌํ•œ ๋‚ด์šฉ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹ค์‹œ ํ•œ ๋ฒˆ !Unpin (์œ ํ˜•์ด ๊ธฐ๋ณธ์ด ์•„๋‹Œ ๊ณ ์ • ๋ถˆ๋ณ€์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธ ํ•จ)๊ณผ !DynSized -like !Move ํ•ฉ์นœ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์›์น˜ ์•Š๋Š” ๋™๊ฒฐ ๋™์ž‘์„ ์ผ์œผํ‚ค์ง€ ์•Š๊ณ ๋Š” ์‹ค์ œ๋กœ ๋™์ผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹  ๋ง์ด ๋งž์Šต๋‹ˆ๋‹ค. Unpin ๋Š” Move ์™€ ๊ฐ™์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ๋‹ค์‹œ Unpin ๋ฏฟ๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Pinned::deref ๋Š” ์ „ํ˜€ ์กด์žฌํ•˜์ง€ ์•Š์•„์•ผํ•˜๋ฉฐ, ๋Œ€์‹  ์ ‘๊ทผ ์ž ์ƒ์„ฑ ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ํ”ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. &Pinned<MovableType> ์™€ ๊ฐ™์€ ์œ ํ˜•์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณ„๋„์˜ ํŠน์„ฑ์œผ๋กœ ์กด์žฌํ•ด์•ผํ•œ๋‹ค๋Š” ์ฃผ์žฅ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” Pinned ๋งŒ์œผ๋กœ Vec ์˜ API ํ‘œ๋ฉด์—์žˆ๋Š” ๋ชจ๋“  ํŠน์„ฑ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๊ทธ๋‹ค์ง€ ์ข‹์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค (ํŠนํžˆ ์ผ๋ถ€ ํŠน์„ฑ์ด ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—). ์‚ฌ๋ก€๋ณ„๋กœ Deref ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ (์˜ˆ : &Pinned<Vec<T>> ๋ฅผ &[Pinned<T>] ๋กœ ์ด๋™) Vec ์ „์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ์ค‘ ํ•˜๋‚˜๋ฅผ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค Unpin (ํ•€ ํ”„๋กœ์ ์…˜์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ)์ด ํ›จ์”ฌ ๋” ์ •์ƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ €๋Š” Vec ์˜ ์ „์ฒด API ํ‘œ๋ฉด ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•  ๊ฒƒ์„ ์ œ์•ˆ ํ•  ์˜๋„๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

Vec ์—์„œ "ํ•€ ํ”„๋กœ์ ์…˜"์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. &Pinned<Vec<T>> ์€ (๋Š”) ์™ธ๋ถ€ ๋ถˆ๋ณ€ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฏ€๋กœ Vec ์—†์ด

๋Œ€์•ˆ์œผ๋กœ Vec<T> ์—์„œ Vec<Pinned<T>> Vec<T> ๋กœ์˜ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๋Œ€๋ถ€๋ถ„์˜ Vec API๋Š” ์žˆ์ง€๋งŒ ์žฌ ํ• ๋‹น์„ ์œ ๋ฐœํ•  ์ˆ˜์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Vec ์˜ ์ •์˜๋ฅผ ํ˜„์žฌ struct Vec<T> ์—์„œ struct Vec<T: ?Sized + ActuallySized> ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ์ข€ ๋œ ์–ด๋ฆฌ์„์€ ์ด๋ฆ„์œผ๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ Sized ๋Š” ActuallySized + Move ; ๊ทธ๋Ÿฐ ๋‹ค์Œ ์žฌ ํ• ๋‹น์„ ์ผ์œผํ‚ฌ ์ˆ˜์žˆ๋Š” ๋ฉ”์„œ๋“œ์— ๋ฐ”์ธ๋”ฉ ๋œ Sized ๋ฐ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋‚ด์žฅ ์Šฌ๋ผ์ด์Šค ์œ ํ˜•์˜ ์š”์†Œ ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฒฝ๊ณ„๋ฅผ Sized ์—์„œ ActuallySized ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋ฉด Sized ๋ฅผ Sized ์ด์™ธ์˜ ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์–ด์ƒ‰ํ•จ์ด ์ƒ๊ฐ ๋‚˜์ง€๋งŒ ๋ฐ˜๋ฉด์— Sized ๊ฒฝ๊ณ„์˜ ๋Œ€๋‹ค์ˆ˜๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ์ฝ”๋“œ์—์„œ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ Move ํ•ฉ๋‹ˆ๋‹ค. ์Šฌ๋ผ์ด์Šค๋กœ ์ธ๋ฑ์Šคํ•˜๊ธฐ ์œ„ํ•ด size_of::<T>() ๋ฅผ ์•Œ์•„์•ผํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹คโ€ฆ

ํ™•์‹คํ•œ! Pinned ๋ฒ„์ „์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๊ฐ€๋ณ€ ๊ณ ์ • ์ฐธ์กฐ์— ๋Œ€ํ•ด ๊ณ ์œ  ํ•œ ํŠน์„ฑ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฑฐ์˜ ๋ชจ๋“  ๋‹ค๋ฅธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ deref ๊ฐ€์žˆ๋Š” PinMut ๋ณด๋‹ค ๋‚˜์˜๊ฑฐ๋‚˜ ์ค‘๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ RefCell ์™€์˜ ์ถฉ๋Œ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹ค๋ฅธ ๊ฒƒ๊ณผ ์ถฉ๋Œํ•˜๋Š” ๋น„์šฉ ( Sized ๊ฒฝ๊ณ„)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•˜๋Š” ์ˆ˜๋™ ์ ‘๊ทผ์ž๋Š” ๋‚˜์—๊ฒŒ ๋‚˜์œ ์ƒ๊ฐ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ œ์•ˆ์ด ์–ด๋–ป๊ฒŒ ์ ‘๊ทผ ์ž ์ƒ์„ฑ์„ ์•ˆ์ „ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค (๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ณ ์ •๋˜์ง€ ์•Š์€ ์ ‘๊ทผ์ž๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋‹จ์–ธํ•˜์ง€ ์•Š๊ณ  ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?).

์ ‘๊ทผ์ž๋Š” ์ง์ ‘ MyStruct ๊ฐ€ ์•„๋‹ˆ๋ผ Pinned<MyStruct> ์—์„œ ๋ฌต์‹œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. &mut MyStruct ์ด์žˆ๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ์ˆ˜๋™์œผ๋กœ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜์—ฌ &mut MyField ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ด๋™ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค. &mut Pinned<MyStruct> ๊ฒฝ์šฐ &mut MyStruct ๋ฐ›์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ( MyStruct ๊ฐ€ !Unpin ์ด๊ฑฐ๋‚˜ Unpin ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ •). ๋”ฐ๋ผ์„œ ์ ‘๊ทผ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ์— ๋„๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ ‘๊ทผ์ž๋Š” &mut Pinned<MyStruct> (์ฆ‰, &mut self ๊ฐ€ ํ•„์š”ํ•˜๊ณ  Pinned<MyStruct> ์— ๋ฌต์‹œ์  ์ž„)๋ฅผ ๋ฐ›๊ณ  &mut Pinned<MyField> ๋˜๋Š” &mut MyField . ์„ ํƒํ•œ ์˜ต์…˜์— ๋”ฐ๋ผ. ํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ ‘๊ทผ ์ž๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ถˆ๋ณ€์„ฑ์€ &mut Pinned<MyField> ๋ฅผ ๋ฐ›๊ณ , ์—ฌ๊ธฐ์— ์“ฐ๊ณ , ์ฐจ์šฉ์„ ํ•ด์ œํ•˜๊ณ , &mut MyField ๋ฅผ๋ฐ›์„ ์ˆ˜ ์—†์–ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒํ•˜๋Š” ๋ฐ์—๋Š” ๊ฝค ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : ๊ณ ์ • ๋œ ์œ ํ˜•์— Vec ). ์นจ์ž… ์ปฌ๋ ‰์…˜์€ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋งค์šฐ ์ž์ฃผ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๊ธฐ์กด ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ Pinned ์ฐธ์กฐ๋ฅผ ์ ˆ๋Œ€ ์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ Unpin ์ž‘๋™ํ•˜๋„๋ก ์„ ํƒํ•ด์•ผํ•œ๋‹ค๋Š” ์•„์ด๋””์–ด์— ๊ทผ๊ฑฐํ•œ ์ œ์•ˆ์€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Unpin ๋ฐ”์šด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Rust์˜ ์ผ๋ฐ˜ ์ƒํƒœ๊ณ„์— ์˜ตํŠธ ์ธ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์€ ์—„์ฒญ๋‚˜๊ฒŒ ํŒŒ๊ดด์  ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์‚ฌ์‹ค, ๋‚ด๊ฐ€ ์›€์ง์ผ ์ˆ˜์—†๋Š” ์œ ํ˜•์— ๋Œ€ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ›จ์”ฌ ๋” ์–ด๋ ค์›Œ ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋‚˜๋Š” ๋‹น์‹ ์ด ์—ฌ๊ธฐ์—์„œ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ๋‚ด ์‹ค์ˆ˜์— ๋Œ€ํ•ด ๋ฐ˜์‘ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค wrt Unpin ๋Œ€ Move :)

์ด์ œ ์ˆ˜์ • ๋˜์—ˆ์œผ๋‹ˆ ... Unpin ์ด ์žˆ์œผ๋ฉด Vec ๊ฐ€)์ด๋ฅผ ๋‹จ์ˆœํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ • ํ•  ๋•Œ ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

ํ•„๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ Vec ๊ตฌ์กฐ์ฒด์˜ ๊ฒฝ์šฐ ํ•„๋“œ์— ๋Œ€ํ•œ ๊ณ ์ •๋˜์ง€ ์•Š์€ ์ฐธ์กฐ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์œ„์—์„œ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค (๊ณ ์ • ๋œ ์ฐธ์กฐ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ๋Œ€๊ฐ€๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค).

์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋”ฐ๋ผ Vec ํฌํ•จ ํ•  ์ˆ˜์žˆ๋Š” ํ•„๋“œ๊ฐ€์žˆ๋Š” ์ผ๋ฐ˜ ๊ตฌ์กฐ์ฒด๋ฅผ ์›ํ•˜๊ฑฐ๋‚˜ ์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๊ณ ์ • ์œ ํ˜•์„ ํฌํ•จ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌํ˜„ ์—ฌ๋ถ€์— ๋Œ€ํ•ด ๋ชจ๋“  ๊ฒƒ์ด ์ƒ๊ฐํ•ด์•ผํ•˜๋Š” Unpin ํŠน์„ฑ์—†์ด์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@comex

๋Œ€์•ˆ์œผ๋กœ Vec์—์„œ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?Vec์—๊ฒŒ>, ๋Œ€๋ถ€๋ถ„์˜ Vec API๊ฐ€ ์žˆ์ง€๋งŒ ์žฌ ํ• ๋‹น์„ ์œ ๋ฐœํ•  ์ˆ˜์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ƒ๋žตํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋•Œ๋ฌธ์—...

์ฆ‰, ํ˜„์žฌ ๊ตฌ์กฐ์ฒด Vec์—์„œ Vec์˜ ์ •์˜๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.Vec๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด, ์ข€ ๋œ ์–ด๋ฆฌ์„์€ ์ด๋ฆ„์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ Sized๋Š” ActuallySized + Move์˜ ๋ณ„์นญ์ด๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์žฌ ํ• ๋‹น์„ ์œ ๋ฐœํ•  ์ˆ˜์žˆ๋Š” ๋ฉ”์„œ๋“œ์— Sized ๋ฐ”์šด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

... ์ •๋ง, ์ •๋ง ๋ณต์žกํ•˜๊ฒŒ ๋“ค๋ฆฌ๋ฉฐ ์‹ค์ œ๋กœ ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( &mut Pinned<Vec<T>> ๋“ฑ์—์„œ ์ผ๋ฐ˜ Vec<T> ์–ป์Œ). ์‚ฌ์‹ค ์ดํ›„์— ๋ฒกํ„ฐ๋ฅผ ๊ณ ์ • ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ผ์ข…์˜ ๋ฉ‹์ง„ ์ผ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Box<Pinned<T>> ์™€ ์ข‹์€ ์œ ์‚ฌ์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ด๋Š” ์ง๊ต ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ณ ์ •์ด ์†Œ์œ  ๋œ ์œ ํ˜•์˜ ์†์„ฑ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ๋ณด์—ฌ์ฃผ๋Š” ๋˜ ๋‹ค๋ฅธ ์˜ˆ์ผ๋ฟ์ž…๋‹ˆ๋‹ค. Unpin ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์€ ์ฐธ์กฐ ์œ ํ˜•์ด ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ๊ณผ ๊ฑฐ์˜ ์ „ํ˜€ ๊ด€๋ จ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ˆ˜์ • ๋˜์—ˆ์œผ๋‹ˆ ... Unpin์ด ์กด์žฌํ•œ๋‹ค๋ฉด Vec์€ ๊ทธ๊ฒƒ์„ ๋‹จ์ˆœํ™”ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๊ฐ€์ • ํ•  ๋•Œ ๋‹น์‹ ์ด ์–ธ๊ธ‰ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‚ด ์š”์ ์„ ์„ค๋ช… ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ์‘๋‹ต ํ•  ๊ฒƒ์ด๋‹ค. PinMut ์—†์ด๋Š” Unpin PinMut ๋ฅผ ํ†ตํ•ด i32 ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์—†๋‹ค. ์–ด๋–ค ์‹œ์ ์—์„œ ๋‹น์‹ ์€ ๋‹น์‹ ์ด ์ž์ฃผ (์™„์ „ํžˆ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ํ•œ) ๊ทธ ์•ˆ์— ๋ญ”๊ฐ€๋ฅผ ์ด๋™ํ•ด์•ผ ๋‹น์‹ ์˜ ๊ตฌ์กฐ ์•„๋ฌด๊ฒƒ๋„ ํ• ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ. Pinned<MyType> ์—์„œ ํ•„๋“œ ์ ‘๊ทผ์ž๋ฅผ ๋ช…์‹œ ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ํ•„์š”ํ•œ ๊ฒƒ์€ ํŠนํžˆ ๋ฌธ์ œ์˜ ํ•„๋“œ๊ฐ€ ํ•ญ์ƒ ์ด๋™ํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜๋‹ค๋ฉด ์ •๋ง ์„ฑ๊ฐ€์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ์ ‘๊ทผ๋ฒ•์€ ๋˜ํ•œ ๋นŒํŠธ์ธ Pinned ์œ ํ˜•๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ •๋ง ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ ๋ณด์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ฉ๋ฒ•์  ์ธ ํ”„๋กœ์ ์…˜์€ ํ•„๋“œ ์œ ํ˜•์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•„๋“œ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Rust์—์„œ ์ด๋ฏธ ๊ฑฐ๋ถ€ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. mut ํ•„๋“œ๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์„ ๋•Œ (๊ทธ๋ฆฌ๊ณ  IMO, ๊ทธ๋Ÿฌํ•œ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ unsafe ๊ฐ€ ๋” ๋‚˜์€ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•„๋“œ๋Š” ์‹ค์ œ๋กœ ํฐ ๋ฐœํŒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ๋‚ด์žฅ ๊ณ ์ • ์œ ํ˜•์€ ๊ณ ์ • ๋œ ์—ด๊ฑฐ ํ˜•์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ๋‚˜๋จธ์ง€ ์–ธ์–ด์™€ ์–ด๋Š ์ •๋„ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์‹ ๊ฒฝ์„ ์”๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ ...

์œ ํ˜• ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋”ฐ๋ผ Vec๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•  ์ˆ˜์—†๋Š” ์œ ํ˜•์„ ํฌํ•จ ํ•  ์ˆ˜์žˆ๋Š” ํ•„๋“œ๊ฐ€์žˆ๋Š” ์ผ๋ฐ˜ ๊ตฌ์กฐ์ฒด๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๊ฒƒ์ด ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ Unpin ์˜ ํ‚ฌ๋Ÿฌ ์‚ฌ์šฉ ์‚ฌ๋ก€์ด๋ฉฐ (์ €์—๊ฒŒ) ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค๋Š” ์‚ฌ์‹ค์€ ๊ฝค ํ™˜์ƒ์ ์ด๋ฉฐ ์ „์ฒด ๊ณ ์ • ๋ชจ๋ธ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. Rust 1.0 ์ด์ „์—๋Š” Unpin ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ๊ตฌ์กฐ์—์„œ ์ธ๋ผ์ธ์—์žˆ๋Š” ์ผ๋ฐ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋„ ํ˜„์žฌ ๊ณ„ํš์ด Unpin ๋กœ ๋ฐ”์ธ๋”ฉํ•ด์•ผํ•˜๋Š” ์œ ์ผํ•œ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค (๊ฑฐ์˜ ๋ชจ๋“  ์•ˆ์ „ํ•œ ์ฐธ์กฐ ์œ ์‚ฌ ์œ ํ˜•์ด ๋ฌด์กฐ๊ฑด Unpin ๊ตฌํ˜„ํ•˜๋„๋ก ํ•จ). ํ†ต๊ณผ.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์ •๋ง๋กœ ์–ป์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์€ : ์™œ Unpin ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์„ ์ œ๊ฑฐํ•˜๋ฉด ๋ณธ์งˆ์ ์œผ๋กœ ์•„๋ฌด๊ฒƒ๋„ ์‚ฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pinned ์—์„œ PinMut (๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€)๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๋ฉ‹์ง„ ๊ฒƒ๋“ค์€ ๊ทธ ์กด์žฌ์™€ ๊ฑฐ์˜ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ•˜๋ฉด ๋‚˜๋จธ์ง€ Rust ์ƒํƒœ๊ณ„์™€ ์‰ฝ๊ฒŒ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. FWIW, Unpin ๋ฐ Pin ์— ๋Œ€ํ•œ deref ์˜ ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„์€ Unpin ์—†์ด๋Š” ๋ชจ๋“  ์œ ํ˜•์ด ๋™์ผํ•˜๊ฒŒ ๋Š๊ปด์ง„๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด ์„œ๋กœ ๊ฑฐ์˜ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค. !Unpin ์œ ํ˜•์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณ ํ†ต (๋ฌด์กฐ๊ฑด์ ์ธ deref ๊ตฌํ˜„์„ ๋” ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธ ํ•จ). ๋‚˜๋Š” ๋„์šธ ์ˆ˜ ์—†์ง€๋งŒ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ๋‹ค๊ณ  ๋Š๋‚€๋‹ค.

๋“œ๋กญ๋˜๋Š” ๊ตฌ์กฐ์˜ ๋‹ค๋ฅธ ํ•„๋“œ๊ฐ€์ด ์ปจํ…์ŠคํŠธ์—์„œ ์ง€์—ญ ๋ณ€์ˆ˜๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๊นŒ? ์‚ฌ์šฉ์ž๊ฐ€ ์ง๋ฉด ํ•œ ๋ฌธ์„œ์—์„œ ๋‚˜์—๊ฒŒ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๊ณตํ‰ํ•˜๊ฒŒ, ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด https://github.com/rust-lang/rust/issues/50765 ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.


์•ˆ๋…•ํ•˜์„ธ์š”.

ํŠนํžˆ Pinned :: deref๊ฐ€ ์žˆ์œผ๋ฉด ๊ธฐ์กด ์œ ํ˜•์œผ๋กœ ๊ณ ์ •์„ ๋™์ ์œผ๋กœ ์ ์šฉ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ ๋•Œ๋ฌธ์— RefCell ์˜ˆ์ œ๊ฐ€ ์ƒ๋‹นํžˆ ๋ฌธ์ œ๊ฐ€๋ฉ๋‹ˆ๋‹ค (์ „๋ฌธํ™”๊ฐ€ ์ถฉ๋ถ„ํ•œ ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ deref ๊ตฌํ˜„์„ ์œ ์ง€ํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ Pin์—์„œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ Pinned๋กœ API ํ‘œ๋ฉด์„ ๊ฑฐ์˜ ๋ณต์ œํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ณด๊ด€ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ณ ์ •๋จ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋†€๋ผ ์šธ ์ •๋„๋กœ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

์šฉ ์šฉ์•ก RefCell ๋ณ„๋„์˜ ๋ฐฉ๋ฒ• ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค borrow_pin ๋ฐ borrow_pin_mut (๋ณต์šฉ Pin<RefCell<T>> ) ๋ฐ ๋‚ด๋ถ€์˜ ๊ณ ์ • ๋œ ์ƒํƒœ๋ฅผ ์ถ”์  RefCell ๋Ÿฐํƒ€์ž„์— PinMut ๋ฐ Pinned ๋ชจ๋‘์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Pinned ๊ฐ€ ๋„์›€์ด๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋‹น์‹ ์˜ ์ฃผ์žฅ์ด ์žˆ์Šต๋‹ˆ๊นŒ? RefCell ๋„ ์ƒํ™ฉ์„ ๋” ์•…ํ™”์‹œํ‚ค์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋‹น์‹ ์€

์ฐจ์ด์ ์€ ์šฐ๋ฆฌ๋Š” Pinned์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” deref๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ PinMut๊ณผ ํ•จ๊ป˜ ์†”๋ฃจ์…˜์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๋‹น์‹ ์ด ๋ฌด์—‡์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์™œ ์ด๊ฒƒ์ด Pinned ์ž‘๋™ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๊นŒ?

@comex

Pinned :: deref๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ๋งคํฌ๋กœ ์ƒ์„ฑ ํ•„๋“œ ์ ‘๊ทผ์ž๋Š” ์ถฉ๋ถ„ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด "๋†€๋ผ ์šธ ์ •๋„๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค"๋Š” ๊ฒƒ์„ ์•Œ์ง€ ๋ชปํ•œ๋‹ค.

deref ์™€ ํ•„๋“œ ์ ‘๊ทผ ์ž ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ deref ์ด Pinned<T> ์—์„œ ์–ด๋–ป๊ฒŒ ๋” ๋ฌธ์ œ๊ฐ€๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋จผ์ € ์œ„ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ๊ธฐ๋‹ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@pythonesque ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฐธ์กฐ ๋’ค์—์žˆ๋Š” ์œ ํ˜• ( "์†Œ์œ  ์œ ํ˜•")์—์„œ ๊ณ ์ • ๋œ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๋Š” ๊ฒƒ์ด ๊ทผ๋ณธ์ ์œผ๋กœ ๋” ์ •ํ™•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํŠนํžˆ ๊ธฐ์กด Rust ์ƒํƒœ๊ณ„์™€์˜ ์ž‘์—…์— ๋Œ€ํ•œ ์ œ์•ฝ์„ ๊ฐ์•ˆํ•  ๋•Œ ์‹ค์ œ๋กœ ๋” ์ธ์ฒด ๊ณตํ•™์ ์ธ ์ „์ฒด API๋กœ ์ „ํ™˜ ๋  ์ˆ˜ ์žˆ์„์ง€ ์˜๋ฌธ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ "๊ทผ๋ณธ์ ์œผ๋กœ ์˜ณ์ง€ ์•Š๋‹ค"๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ณ ์˜์ ์œผ๋กœ ์ง„ํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์— ์ตœ์†Œํ•œ ์‹คํ—˜์„ ์œ„ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ํ•œ ํ™•์‹  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„ํšŒํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@pythonesque , ์™€์šฐ, ๊ด‘๋ฒ”์œ„ํ•œ ์š”์•ฝ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค! ์ž‘์—…์— RFC๊ฐ€ ์žˆ๋‹ค๋Š” ์†Œ์‹์„ ๋“ฃ๊ณ  ๊ธฐ์ฉ๋‹ˆ๋‹ค. :)

ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ mem::swap ๋˜๋Š” mem::replace ์™€ ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ณ ์ • ๋œ ๊ฐ’์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ์ทจํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— Pin ์˜ Unpin ๊ฐ’์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ deref๋ฅผ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๊ฐ€ Unpin ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ž์—ฐ ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— swap ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•จ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๊ณ ์ • ๋œ ๊ฐ’์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ๋” ์ด์ƒ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. swap ๋ฐ replace ์—์ด ๊ฒฝ๊ณ„๊ฐ€์žˆ์„ ๋•Œ ์—…๋ฐ์ดํŠธ ๋œ ํ•จ์ˆ˜๋„ ํ•จ๊ป˜ ์ˆ˜ํ–‰ํ•ด์•ผํ–ˆ๋˜์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ณ€๊ฒฝ์ด ์•„๋‹˜์„ ๋”์šฑ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ช‡ ๊ฐ€์ง€ ์ƒ๊ฐ์„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ธฐ๋ณธ์ ์œผ๋กœ Drop ๊ฐ™์€ ํŠน๊ถŒ์„ ์ œ๊ณต Unpin - ๋‹น์‹ ์ด ์–ป์„ ์ˆ˜์žˆ๋Š” &mut ์ด์ „์— ๋ฌด์–ธ๊ฐ€์— PinMut . ๊ทธ๋ฆฌ๊ณ  Drop ๋Š” ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Unpin ๋Š” ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ด๋Š” mem::forget ์ด๊ณ  ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ˆ„์ˆ˜ ๋ฐœ์ƒ).
  2. ์ƒ์„ฑ๊ธฐ๋ฅผ ๊ณ ์ • ํ•ด์ œํ•˜์ง€ ์•Š๋Š” ํ˜„์žฌ ์„ ๋ฌผ ๊ธฐ๋ฐ˜ API์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด self: PinMut<Self> ( unsafe impl Unpin ์•„๋‹˜)์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ 100 % ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  3. Unpin ๊ฐ€ ์•ˆ์ „ํ•œ ๊ฒฝ์šฐ API๊ฐ€ ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๋‚˜์š”? ๋Œ€๋‹ต์€ ์˜ˆ์ž…๋‹ˆ๋‹ค. ์ƒ์„ฑ๊ธฐ๊ฐ€ Unpin ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ !Unpin ์œ ํ˜•์— ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ•€ ๋Œ์ถœ๋ถ€๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค! ์ด์ƒ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  5. Self๊ฐ€ Unpin ๋˜๋Š” Drop [edit : true or false?]๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ณ ์ • ํ”„๋กœ์ ์…˜์€ ์•ˆ์ „

์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ API์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์–ธ์–ด ์ง€์› ๋Œ€์•ˆ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” Unpin ์™„์ „ํžˆ ์‚ญ์ œํ•˜๊ณ  ๋Œ€์‹  ๊ทน์„ฑ์„ ๋’ค์ง‘๋Š” ๊ฒƒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ์ด๋Ÿฌํ•œ ๋ณด์ฆ ์„ ๋ฐ›๊ธฐ Pin ํŠน์„ฑ์ž…๋‹ˆ๋‹ค. ์˜ตํŠธ ์•„์›ƒ . ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ƒ๋‹นํ•œ ์–ธ์–ด ์ง€์›์ด ํ•„์š”ํ•˜์ง€๋งŒ ํ˜„์žฌ ๊ตฌํ˜„์€ ์ „์ ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. ์ข€ ๋” ๊นŠ์ด ์ƒ๊ฐํ•œ ํ›„์— ๋‹ค๋ฅธ ๊ธ€์„ ์˜ฌ๋ฆด ๊ฒŒ์š”.


๋‚ด๊ฐ€ ๊ณ„์† ์žŠ์–ด ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋˜ ๋‹ค๋ฅธ ๋ฉ”๋ชจ :

ํ•€ ํ”„๋กœ์ ์…˜ ์•ˆ์ „์„ฑ์€ ํ•„๋“œ ์œ ํ˜•์ด ์•„๋‹Œ ์ž์ฒด ์œ ํ˜• ์—๋งŒ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ํ•„๋“œ ์œ ํ˜•์€ ๋ฌด์กฐ๊ฑด์ ์ธ ๊ณต๊ฐœ API์˜ ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์žฌ๊ท€ ๊ฒ€์‚ฌ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. Self ์ด Pin ์—์„œ ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ์œ ํ˜•์˜ ํ•„๋“œ์— ํ•€ ํˆฌ์˜์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

@withoutboats FWIW ์ด๊ฒƒ์€ @cramertj ์™€ ์ œ๊ฐ€ ์ด์ „ ํ† ๋ก ์—์„œ ๋„๋‹ฌ ํ•œ ๊ฒฐ๋ก ๊ณผ ์ •ํ™•ํžˆ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์ฒ˜์Œ์—๋Š” ํŒŒ์ƒ๋ฌผ์—์„œ ๋‚ด ๋ณด๋‚ธ ์ผ๋ถ€ ํŠน์ˆ˜ ๋ชฉ์  ์†์„ฑ์„ ํ†ตํ•ด ์ƒํ˜ธ ๋ฐฐ์ œ ๊ฒ€์‚ฌ๋ฅผ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

๊ธฐ๋ณธ์ ์œผ๋กœ Drop์€ ๊ณ ์ • ํ•ด์ œ์™€ ๋™์ผํ•œ ๊ถŒํ•œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— PinMut์— ์žˆ๋˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด & mut์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Drop์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, Unpin์ด ์•ˆ์ „ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (์ด๋Š” mem :: forget ๋ฐ leakpocalypse์ž…๋‹ˆ๋‹ค).

๋‚˜๋Š” leakpocalypse์™€์˜ ์—ฐ๊ฒฐ์„ ๋ณด์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์กฐ๊ธˆ ์ฃผ์ €ํ•˜๋Š” ์œ ์ผํ•œ ์ด์œ ๋Š” Drop ์ด๋ฉด ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‹ ๊ฒฝ ์“ธ ํ•„์š”๊ฐ€์—†๋Š” ์ฝ”๋„ˆ ์ผ€์ด์Šค์ฒ˜๋Ÿผ ๋Š๊ปด์กŒ ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์žฅ์ ์ธ์ง€ ์•„๋‹Œ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์•ˆ์ „ํ•œ Unpin ๋Š” ์—ฌ๊ธฐ์—์„œ ์ผ๊ด€์„ฑ์„ ๋†’์ด๊ณ  Drop ๋ฌธ์ œ๋ฅผ ๋” ์ด์ƒ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š์Œ์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ "ํ•ด๊ฒฐ"ํ• ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  impl Drop ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•”์‹œ ์  impl Unpin ์™€ ํ•จ๊ป˜ ์ œ๊ณต๋จ); ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์—์„œ ๊ทธ๊ฒƒ์€ ๋˜ํ•œ ์‚ฌ๋ฌผ์˜ Future ์ชฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ „์ฒด์ ์ธ ์Šน๋ฆฌ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@pythonesque ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ Unpin ๋Š” ์นจ์ž… ์ปฌ๋ ‰์…˜์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ Drop ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ผํ–ˆ๋‹ค๋ฉด ์—ฌ์ „ํžˆ ์ผํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.


์•ˆ๋…•ํ•˜์„ธ์š”.

Self๊ฐ€ Unpin ๋˜๋Š” Drop์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Pin ํˆฌ์˜์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. [edit : true ๋˜๋Š” false?] ๊ฒ€์‚ฌ๋ฅผ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฒ˜์Œ์— ์—ฌ๊ธฐ์—์„œ ํ•„๋“œ ์œ ํ˜•์„ ์–ธ๊ธ‰ํ–ˆ์œผ๋ฉฐ ์™œ ์ด๊ฒƒ์ด ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ๋ฌผ์–ด ๋ณด๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๊ฒŒ์‹œ๋ฌผ์„ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค. :) ์ด๊ฒƒ์€ Self ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋งŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์—์„œ ๋‚˜๋Š” ๋‚ด ๊ด€์ ์—์„œ ๋‹น์‹ ์˜ ์ฃผ์žฅ์„ ๊ฑฐ์˜ ๋ฐ˜๋ณตํ•œ๋‹ค.

๋ณธ์งˆ์ ์œผ๋กœ ์งˆ๋ฌธ์€ Self ๊ฐ€ ๊ณ ์ • ๋ถˆ๋ณ€์„ ์–ด๋–ป๊ฒŒ ์„ ํƒํ•ฉ๋‹ˆ๊นŒ? ๊ธฐ๋ณธ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” (์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋”๋ผ๋„!) ๊ณ ์ • ๋ถˆ๋ณ€์ด ์†Œ์œ  ๋œ ๋ถˆ๋ณ€๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ณ ์ •์€ ์œ„์น˜์™€ ๋…๋ฆฝ์ ์ด๋ฉฐ์ด ์œ ํ˜•์€ ๊ณ ์ •์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. PinMut<T> ๋กœ &mut T ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜์—†๋Š” ํ•œ, ๊ทธ๊ฒƒ์€ ์•ˆ์ „ํ•œ ๊ฐ€์ •์ž…๋‹ˆ๋‹ค.

ํ•„๋“œ ํ”„๋กœ์ ์…˜์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ณ ์ • ๋ถˆ๋ณ€์ด ๋Œ€์‹  "๋ชจ๋“  ํ•„๋“œ๊ฐ€ ํ•ด๋‹น ์œ ํ˜•์˜ ๋ถˆ๋ณ€์— ๊ณ ์ •๋จ"์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถˆ๋ณ€์€ ํ•„๋“œ ์œ ํ˜•์— ๊ด€๊ณ„์—†์ด ๊ณ ์ • ํˆฌ์˜์„ ์‰ฝ๊ฒŒ ์ •๋‹นํ™”ํ•ฉ๋‹ˆ๋‹ค (์ฆ‰, ์›ํ•˜๋Š” ๊ณ ์ • ๊ณ ์ • ๋ถˆ๋ณ€์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ). ๋ฌผ๋ก ์ด ๋ถˆ๋ณ€์„ฑ์€ PinMut<T> ๋ฅผ &mut T ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์œ ํ˜•์ด Drop ๋˜๋Š” Unpin ๊ฐ€ ์•„๋‹Œ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” leakpocalypse์™€์˜ ์—ฐ๊ฒฐ์„ ๋ณด์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ง€ ๋น„์œ -Unpin์€ mem :: forget์ด Rc ์‚ฌ์ดํด์— ๋Œ€ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ Dropํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. mem :: forget์€ ์›๋ž˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜์—ˆ์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์ •๋‹น์„ฑ์€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. (๊ทธ๋ฆฌ๊ณ  Rc ์‚ฌ์ดํด์ด ์—ฃ์ง€ ์ผ€์ด์Šค๋ผ๋Š” ๋™์ผํ•œ ์ฃผ์žฅ์ด mem :: forget safe ํ‘œ์‹œ์— ๋Œ€ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.)

Discord์—์„œ (์˜์ ์œผ๋กœ) ๋ณต์‚ฌ-๋ถ™์—ฌ ๋„ฃ๊ธฐ, ์ €๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋’ค์ง‘์ง€ ์•Š์•˜๋‹ค๋Š” ์ฆ๊ฑฐ๋ฅผ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค : Unpin์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ณ , ๊ตฌ์กฐ์  ํ•€ ์ ‘๊ทผ์ž๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์–ด (์ด๊ฒƒ์€ ๋˜ํ•œ ์–ด๋–ค ๋„์ž… ๋œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ํŠน์„ฑ, ๋งž์Šต๋‹ˆ๊นŒ? ์—ฌ์ „ํžˆ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค). ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์ด ์™„์ „ํžˆ ์•ˆ์ „ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋ฅผ ๊ดด๋กญ ํž™๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ช…์‹œ์ ์ธ Unpin impl์ด์—†๋Š” ํ•œ ์œ ํ˜•์— ๋Œ€ํ•œ Drop impl์ด์—†๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ณ„ํš์—์„œ ์šฐ๋ฆฌ๋Š” ํ›จ์”ฌ ๋” ๊ฐ•๋ ฅํ•œ ๊ฒƒ์„ ์š”๊ตฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํƒ€์ž…์— ๋Œ€ํ•œ ๋ช…์‹œ์ ์ธ! Unpin impl์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ›จ์”ฌ ์ ์€ ํƒ€์ž…์— ๋Œ€ํ•ด ์‚ฌ์‹ค ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค (์ฆ‰, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค).

๋ถˆํ–‰ํžˆ๋„ ์ €๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํŠน์ • ์œ ํ˜•์— ๋Œ€ํ•œ ์ˆ˜๋™ Unpin impl์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. "has any impl"๊ณผ๋Š” ๋Œ€์กฐ์ ์œผ๋กœ ํŠน์ˆ˜ํ™”์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด ์ข‹์ง€ ์•Š์€์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์˜ ์ž‘์„ฑ์ž๊ฐ€ ๊ตฌ์กฐ์  ๊ณ ์ •์„ ์–ป๊ธฐ ์œ„ํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก ํ•ด๋‹น ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด impl Unpin ๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ํ–‰๋ณต ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ... ๊ทธ๊ฒŒ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ง€๊ธˆ ์ดํ•ดํ•˜๋ ค๊ณ ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๋„ค๋ฆญ์—์„œ ๋ชจ๋“  ์ œ๋„ค๋ฆญ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๋Œ€ํ•œ API๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ๊ณ ์ • ํ•ด์ œ๋Š” ํฌ๊ธฐ๊ฐ€ ์ง€์ •๋œ ์•”์‹œ ์  ๋ฐ”์šด๋“œ์ž…๋‹ˆ๊นŒ?

vec์˜ ๊ฒฝ์šฐ ์ •ํ™•ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.๊ณ„์† ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ์ • ํ•ด์ œ๋Š” ํฌ๊ธฐ์™€ ๊ฐ™์€ ์•”์‹œ ์  ๊ฒฝ๊ณ„์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ.

vec์ด ๊ณ„์† ์•ˆ์ „ํ•˜๋ ค๋ฉด ์ •ํ™•ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์™œ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

์„ฑ๊ฐ€์‹  ์ผ์ด @MajorBreakfast ์˜ค๋Š˜ ๋ช…์ค‘ ๊ฒƒ์„ : PinMut::get_mut ๋‹น์‹ ์—๊ฒŒ ์ œ๊ณต &mut ์˜ ์ˆ˜๋ช… ์›๋ž˜ PinMut ์ดํ›„ํ•˜์ง€๋งŒ ๊ฐ™์€ ์ผ์„ ํ•  ์ˆ˜์žˆ๋Š” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค, DerefMut ๋Š” PinMut ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ์˜ ์ˆ˜๋ช…๊ณผ ํ•จ๊ป˜ ์ฐจ์šฉ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” get_mut ๋ฅผ ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค๊ณ  get_mut_unchecked ?

์ด๋Ÿฐ ๋ง์ธ๊ฐ€์š”?

fn get_mut(this: PinMut<'a, T>) -> &'a mut T where T : Unpin

๊ทธ๋ž˜, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค.

@RalfJung ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์„ ๋ฌผ ์ƒ์ž ์˜ ๋ฐฉ๋ฒ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

fn next(&mut self) -> Option<&'a mut F> {
    self.0.next().map(|f| unsafe { PinMut::get_mut(f) })
}

F ์— Unpin ๊ฒฝ๊ณ„๊ฐ€ ์žˆ๊ณ  ์™„์ „ํžˆ ์•ˆ์ „ํ•˜๋”๋ผ๋„ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ธ”๋ก์„ ์‚ฌ์šฉํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ PinMut ์˜ ์ˆ˜๋ช…์„ ์œ ์ง€ํ•˜๋Š” ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

๋„ค, API์˜ ์ƒ๋žต ์ผ๋ฟ์ž…๋‹ˆ๋‹ค.

PR์„ ์ค€๋น„ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ œ๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. get_mut ๋ฐ get_mut_unchecked ๋ผ๊ณ  ๋ถ€๋ฅด์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

์•ˆ์ „ํ•œ map ํ•˜๊ณ  ํ˜„์žฌ ์ด๋ฆ„๋„ map_unchecked ๋กœ ๋ณ€๊ฒฝํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ชจ๋“  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ PinMut ์—์„œ ์ตœ์ข… _unchecked ํ•˜๊ณ  ์•ˆ์ „ํ•œ ํ•ด๋‹นํ•˜๋Š”์ด

get_mut ๋ฐ get_mut_unchecked๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?

ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์•ˆ์ „ํ•œ map ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

๊ฑฐ๊ธฐ ์กฐ์‹ฌํ•˜์„ธ์š”. ์–ด๋–ค ๋ชจ์Šต์„ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ? ์ง€๋„๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ด์œ ๋Š” ์•ˆ์ „ํ•œ์ง€๋„๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ฑฐ๊ธฐ ์กฐ์‹ฌํ•˜์„ธ์š”. ์–ด๋–ค ๋ชจ์Šต์„ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ?

๋„ค๊ฐ€ ์˜ณ์•„. ๋ฐ˜ํ™˜ ๊ฐ’์— Unpin ๋ฐ”์ธ๋”ฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ์•„์ด๋””์–ด๊ฐ€ ๋–  ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค. PinArc ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์„ ๋ฌผ ์ƒ์ž์˜ BiLock impl (https://github.com/rust-lang-nursery/futures-rs/pull/1044)์—์„œ ๊ทธ๋Ÿฐ ๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@MajorBreakfast PinArc (๋ฐ PinRc ๋“ฑ)์€ Pin (๋น„ Mut ๋ฒ„์ „)์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ถ”๊ฐ€ ํ•  ์ƒ๊ฐ์ด์ง€๋งŒ ๊ทธ๊ฒƒ์ด ์ œ๊ณต ํ•  ๋ณด์žฅ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•œ ํ•ฉ์˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

PinArc ์ถ”๊ฐ€ํ•˜๋ฉด ๋ญ”๊ฐ€ ์ถ”๊ฐ€๋˜๋Š”์ง€ ๋” ์ด์ƒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ^^ ' Arc ์ด๋ฏธ "์ฐจ์šฉ ํ•œ ์ฝ˜ํ…์ธ ์—์„œ ์ด๋™"์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@MajorBreakfast Arc ์‚ฌ์šฉํ•˜์—ฌ Arc::try_unwrap Arc ๋ฐ–์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ T: Unpin ๊ฒฝ๊ณ„๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”!
ํ•€ ์ ‘๊ทผ์ž๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ํ•€ ์ ‘๊ทผ ์ž ๋ฌธ์ œ๋Š” T: !Unpin + Drop ์กฐํ•ฉ์ด์žˆ์„ ๋•Œ _only_ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด T ์œ ํ˜•์˜ ์กด์žฌ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋Š” ๋…ผ์˜๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด !Unpin ๋ฐ Drop ์„ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ƒํ˜ธ ๋ฐฐํƒ€์ ์œผ๋กœ ๋งŒ๋“ค์—ˆ์ง€ ๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ์ง€ ์•Š๊ณ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช…ํ™•ํ•œ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ์œ ํ˜•์ด !Unpin ๋ฐ Drop ์ธ ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š๊ณ  ์•ˆ์ „ํ•œ Pin ์ ‘๊ทผ์ž๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๊ทธ๋Ÿฌํ•œ ์œ ํ˜•์„ Pin<T> ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค Unpin ํŠน์„ฑ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •์‹ ์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

ํ˜„์žฌ๋Š” !Unpin ๋ฐ Drop ๋‘˜ ๋‹ค์ธ Pin<T> ์œ ํ˜•์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ž…๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” "์†”๋ฃจ์…˜"์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ์•„์ง ๋…น์Šฌ์ง€ ์•Š์€ ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฌธ์ œ์ด์ง€๋งŒ ์ €๋Š” ๊ทธ๊ฒƒ์ด ์‹œ์ž‘๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์—ฌ๊ธฐ์— ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

/// This is an empty trait, it is used solely in the bounds of `Pin`
unsafe trait Pinnable {}

/// Add the extra trait bounds here, and add it to the various impls of Pin as well
struct Pin<T: Pinnable> {
    ...
}

/// Then we impl Pinnable for all the types we want to be able to put into pins
unsafe impl<T: Unpin> Pinnable for T {}
unsafe impl<T: !Unpin + !Drop> Pinnable for T {}

๋ชจ๋‘ Unpin ์ž…๋‹ˆ๋‹ค ์ข…๋ฅ˜ ๋ฐ ์œ ํ˜• !Unpin ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ !Drop , ํ•€ ์ ‘๊ทผ๋กœ (๋‚ด ์ง€์‹) ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Drop ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉฐ Pin ๊ตฌ์กฐ์ฒด์— ๋„ฃ์„ ์ˆ˜์žˆ๋Š” ๊ฒƒ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. !Unpin ๋ฐ Drop (์‹ค์ œ๋กœ Pin ๋‚ด๋ถ€์— ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์Œ) ์œ ํ˜•์ด ๋ชจ๋‘ ํ•„์š”ํ•œ ๊ฐ€๋Šฅ์„ฑ์ด์—†๋Š” * ๊ฒฝ์šฐ์— Drop ๋ฅผ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค unsafe impl Pinnable ์œ ํ˜•์— ๋”ฐ๋ผ

* ์ €๋Š” Pin ๋Œ€ํ•œ ๊ฒฝํ—˜์ด ์—†์ง€๋งŒ !Unpin ์œ ํ˜•์— ๋Œ€ํ•ด impl Drop ๊ฐ€ ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๊ฐ€ ์›์ธ์ด ์•„๋‹ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์‚ญ์ œํ•ด์•ผํ•˜๋Š” ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ !Unpin ์ด์ง€๋งŒ Drop ํ•„๋“œ์™€ !Unpin ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ตฌ์กฐ์ฒด๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Drop ํ•„๋“œ๋Š” !Unpin ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์ž์ฒด ๊ตฌ์กฐ์ฒด๋กœ ๋ถ„๋ฆฌ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋” ์ž์„ธํžˆ ์„ค๋ช… ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์„ค๋ช…์ด ์–ด๋ฆฌ์„์€ ๊ฒƒ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ฃผ์„์˜ ๋ณธ๋ฌธ์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ง€๊ธˆ์€ ์งง๊ฒŒ ๋‚จ๊ฒจ ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ํ•€ ์ ‘๊ทผ ์ž ๋ฌธ์ œ๋Š” T :! Unpin + Drop ์กฐํ•ฉ์ด์žˆ์„ ๋•Œ๋งŒ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

"and"๋ณด๋‹ค "or"์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

ํ•€ ์ ‘๊ทผ์ž๋Š” ๊ณ ์ •์— ๋Œ€ํ•œ "๊ตฌ์กฐ์ "ํ•ด์„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. T ๊ฐ€ ๊ณ ์ •๋˜๋ฉด ๋ชจ๋“  ํ•„๋“œ๋„ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— impl Unpin ๋ฐ Drop ๋Š” ์œ ํ˜•์ด ๊ณ ์ •์— ์ „ํ˜€ ๊ด€์‹ฌ์ด ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. T ๊ณ ์ •๋˜๊ฑฐ๋‚˜ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ T ์˜ ํ•„๋“œ๋Š” ๋‘ ๊ฒฝ์šฐ ๋ชจ๋‘ ๊ณ ์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜์ค‘์— !Unpin + !Drop ์œ ํ˜•์ด ์ ‘๊ทผ์ž๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ถ”๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์œ ํ˜•์ด๋ผ๊ณ  ๋งํ–ˆ์„ ๋•Œ ๋ฐ”๋กœ์ด ๊ฒฐ๊ณผ๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. (์œ ํ˜•์€ ์—ฌ์ „ํžˆ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ ์ž˜๋ชป๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋„๋ก์ฃผ์˜ํ•ด์•ผํ•˜์ง€๋งŒ Unpin ad Drop ๋Š” ๊ณ ์ • ์ ‘๊ทผ์ž๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.)

์ด ๋ฌธ์ œ๋ฅผ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ํƒ€์ž…์ด๋˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€ ์•Š๊ณ  ์•ˆ์ „ํ•œ Pin ์ ‘๊ทผ์ž๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! Unpin and Drop, ๋‹จ์ง€ ๊ทธ๋Ÿฌํ•œ ํƒ€์ž…์€ Pin์— ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค..

๋‚˜๋Š” ๋”ฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๊ฒŒ ์™œ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์„ธ์š”? ๊ทธ๋ ‡๋‹ค๋ฉด ์œ ํ˜•์„ ๊ณ ์ • ํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ ๊ณ ์ • ๋œ ์ ‘๊ทผ ์ž์— ๊ด€์‹ฌ์ด์žˆ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

"and"๋ณด๋‹ค "or"์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐ ํ•ด ๋ด…์‹œ๋‹ค. ์ œ ์ „์ฒด ์•„์ด๋””์–ด๊ฐ€ ์ด๊ฒƒ์˜ ๋ฐ˜๋Œ€์— ๊ธฐ๋ฐ˜์„๋‘๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๊ฐ€ ์ด๊ฒƒ์„ ์˜คํ•ดํ–ˆ๋‹ค๋ฉด ๋‚˜๋จธ์ง€ ์•„์ด๋””์–ด๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ดํ•ด ๋‚ด (ํ˜„์žฌ)๋กœ, ์ธ ์œ ํ˜• ํ•€ ์ ‘๊ทผ Unpin ๊ด€๊ณ„๋กœ, ๋‚™ํ•˜, ์™„์ „ํžˆ ๊ฑด์ „ํ•œ Pin<T> ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค &mut T ์–ด์จŒ๋“ . ๋˜ํ•œ !Drop ์œ ํ˜•์˜ ํ•€ ์ ‘๊ทผ์ž๋Š” !Unpin ์œ ํ˜•์˜ ๊ฒฝ์šฐ์—๋„ ์™„์ „ํžˆ ๊ฑด์ „ํ•ฉ๋‹ˆ๋‹ค. drop ๋Š” &mut self ์–ป์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. !Unpin ์œ ํ˜•์—์„œ Pin ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ž˜๋ชปํ•œ ๊ฒฝ์šฐ ์•Œ๋ ค์ฃผ์„ธ์š”. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ Unpin + Drop ์œ ํ˜• ๋˜๋Š” !Unpin + !Drop ์œ ํ˜•์€ ํ•€ ์ ‘๊ทผ ์ž์—์„œ ์™„์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉฐ ์œ ์ผํ•œ ๋ฌธ์ œ ์œ ํ˜•์€ !Unpin + Drop ์ž…๋‹ˆ๋‹ค.

ํ—‰ํ—‰

๋˜ํ•œ,! Drop ์œ ํ˜•์˜ ํ•€ ์ ‘๊ทผ์ž๋Š”! Unpin ์œ ํ˜•์˜ ๊ฒฝ์šฐ์—๋„ ์™„์ „ํžˆ ์†Œ๋ฆฌ๊ฐ€๋‚ฉ๋‹ˆ๋‹ค. drop์€ ํ•€์— ๋“ค์–ด๊ฐ€๋ฉด! Unpin ์œ ํ˜•์—์„œ & mut self๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฌผ๊ฑด์„ ๋ฐ–์œผ๋กœ ์˜ฎ๊ธฐ์‹ญ์‹œ์˜ค.

struct Foo(InnerNotUnpin); impl Unpin for Foo {} ๋ฅผ ์“ฐ๋ฉด PinMut<Foo> ์—์„œ PinMut<InnerNotUnpin> ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฑด์ „ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ์…˜์ด ์†Œ๋ฆฌ๊ฐ€ ๋‚˜๋„๋กํ•˜๋ ค๋ฉด (a) drop impls๋ฅผ ๊ธˆ์ง€ํ•˜๊ณ  (b) ํ•„๋“œ๊ฐ€ Unpin ๊ฒฝ์šฐ์—๋งŒ ๊ตฌ์กฐ๊ฐ€ Unpin ์ธ์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

(a) !Unpin ๊ฒƒ์— ๋“œ๋กญ ์ž„ํ”Œ๋ž€ํŠธ๋ฅผ ๊ธˆ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?
(b) Unpin ๊ตฌํ˜„์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์œ ํ˜•์ด ์‹ค์ œ๋กœ ๊ณ ์ • ํ•ด์ œ ๋  ์ˆ˜ ์—†์„ ๋•Œ ๊ณ ์ • ํ•ด์ œ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š๊ฒŒ ์ฃผ์žฅํ•˜์—ฌ ์ž์‹ ์„ ์  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Sync ์ผ์ด ์žˆ์–ด์„œ๋Š” ์•ˆ๋˜๋ฉฐ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ถˆ๊ฑด์ „ ํ•œ ํ–‰๋™์œผ๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.

(a) ๊ทธ๋ƒฅ ๋ฌผ๊ฑด์— ๋“œ๋กญ ์ž„ํ”Œ๋ž€ํŠธ๋ฅผ ๊ธˆ์ง€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค!

์˜ˆ,ํ•˜์ง€๋งŒ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์— ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋‚ด ์š”์ ์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š”! Unpin์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์œ ํ˜•์˜! Unpin ๋งˆ์ปค๋Š” ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ ํ•ด๋‹น ์œ ํ˜•์ด Pin ์•ˆ์—์žˆ์„ ๋•Œ๊นŒ์ง€ ์•ฝ์†์„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ! Unpin ์œ ํ˜•์˜ drop impl์€ ํ•ด๋‹น ์œ ํ˜•์ด Pin_ ์•ˆ์— ์žˆ์ง€ ์•Š๋Š” ํ•œ ์™„์ „ํžˆ ์†Œ๋ฆฌ๊ฐ€๋‚ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ Pin์„ Pin<T> ์—์„œ Pin<T: Pinnable> ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Pinnable ํŠธ๋ ˆ์ด ํŠธ๋Š” Drop + !Unpin (๋˜๋Š” ๊ทธ ์ด์ƒ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•€ ์ ‘๊ทผ์ž๊ฐ€ ๋ฌธ์ œ๊ฐ€๋˜๋Š” ์œ ํ˜•)์€ Pin ์•ˆ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.

๊ทธ ์‹œ์ ์—์„œ ๋‹น์‹ ์€ Unpin ํŠน์„ฑ์„ ์™„์ „ํžˆ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“ค๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๋˜ํ•œ ํ˜„์žฌ Rust๋กœ๋Š” ํ•„์š”ํ•œ ๊ฒฝ๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. " Unpin ์™€ Drop ๊ฐ€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Pinnable ์™€ ๋น„์Šทํ•œ ๊ฒƒ์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋„์›€์ด๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

Unpin ํŠน์„ฑ์€ ์ž์ฒด์ ์œผ๋กœ ์ด๋ฏธ "์“ธ๋ชจ์—†๋Š”"ํŠน์„ฑ์ž…๋‹ˆ๋‹ค. _only_ ํŠน์„ฑ์€ ์œ ํ˜•์ด ๊ณ ์ •๋˜๋ฉด ์œ ํ˜•์ด Pin์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ์ „์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@RalfJung ๊ณผ ์ €๋Š” ๋ฐฉ๊ธˆ ์ด๋Ÿฌํ•œ API์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ธฐ ์œ„ํ•ด ํšŒ์˜๋ฅผ ๊ฐ€์กŒ์œผ๋ฉฐ ์ฃผ์š” API ๋ณ€๊ฒฝ์—†์ด API ๋ฅผ ์•ˆ์ •ํ™” ํ•  ์ค€๋น„๊ฐ€๋˜์–ด ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ

ํ•€ API์— ๋Œ€ํ•œ ๋‚˜์˜ ๋ฏฟ์Œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. PinMut ๋ฐ Unpin ์˜ ํ•ต์‹ฌ API ๊ฐœ๋…์€ ๊ธฐ๋ณธ ์ œ๊ณต ์–ธ์–ด ์ง€์›์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์ตœ์ƒ์˜ ์†”๋ฃจ์…˜์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด๋Ÿฌํ•œ API๋Š” ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒฝ์šฐ ํ–ฅํ›„ ๊ธฐ๋ณธ ์ œ๊ณต ์–ธ์–ด ์ง€์›์„ ๋ฐฐ์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ์˜ ๊ฒฐ์ •์„ ๊ธฐ๋กํ•˜๊ณ  ์‹ถ์€ ํ•œ๊ณ„์™€ ์ ˆ์ถฉ์ ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋›ฐ์–ด๋‚œ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Drop ์˜ ๋ฌธ์ œ

RFC๋ฅผ ๋ณ‘ํ•ฉ ํ•  ๋•Œ๊นŒ์ง€ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•œ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” Drop ํŠน์„ฑ์˜ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. Drop::drop ๋ฉ”์„œ๋“œ์—๋Š” ์ž์ฒด &mut self ๋ฅผ ์ทจํ•˜๋Š” API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ Self "๊ณ ์ • ํ•ด์ œ"์ด๋ฉฐ ๊ณ ์ • ๋œ ์œ ํ˜•์ด ์ œ๊ณตํ•ด์•ผํ•˜๋Š” ๋ณด์žฅ์„ ์œ„๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค.

๋‹คํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ํ•€์œผ๋กœ ํˆฌ์‚ฌํ•˜๋ ค๋Š” ํ•ต์‹ฌ "์ด๋™์‹ ์ƒ์„ฑ๊ธฐ"์œ ํ˜•์˜ ๊ฑด์ „์„ฑ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋“ค์€ ์†Œ๋ฉธ์ž๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ !Unpin ๊ตฌํ˜„์€ ์‹ค์ œ๋กœ์ด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค .

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ์ง์ ‘ ์ •์˜ํ•œ ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ "๊ณ ์ • ํ•ด์ œ"ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋ฉฐ Drop ๊ตฌํ˜„ํ•˜๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” Unpin ๊ฐ€ unsafe trait ๋ผ๋Š” ๊ฒƒ์€ ์šฐ๋ฆฌ์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ์•ˆ์ „์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Drop ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์€ ๊ฑด์ „์„ฑ์— ๊ด€ํ•œ ํ•œ Unpin ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋งŒ ํผ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฑฑ์ •.

์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์šฐ๋ฆฌ๋Š” Unpin ํŠธ๋ ˆ์ด ํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ˆ์ „ํ•œ ํŠธ๋ ˆ์ด ํŠธ๋กœ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•€ ํˆฌ์˜

ํ˜„์žฌ API์˜ ์ฃผ์š” ์ œํ•œ ์‚ฌํ•ญ์€ ํ•„๋“œ๊ฐ€ Unpin ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ๋•Œ ํ•€ ํ”„๋กœ์ ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ž๋™์œผ๋กœ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•€ ํˆฌ์˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

U ์œ ํ˜•์˜ a ํ•„๋“œ๊ฐ€์žˆ๋Š” T ์œ ํ˜•์ด ์ฃผ์–ด์ง€๋ฉด ๋‹ค์Œ ์•ก์„ธ์Šค๋ฅผ ํ†ตํ•ด PinMut<'a, T> ์—์„œ PinMut<'a, U> ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ "ํ”„๋กœ์ ํŠธ"ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ a .

๋˜๋Š” ์ฝ”๋“œ์—์„œ :

struct Foo {
    bar: Bar,
}

impl Foo {
    fn bar(self: PinMut<'_, Foo>) -> PinMut<'_, Bar> {
        unsafe { PinMut::map_unchecked(self, |foo| &mut foo.bar) }
    }
}

ํ˜„์žฌ๋กœ์„œ๋Š” ํ•„๋“œ ์œ ํ˜•์ด Unpin ๊ตฌํ˜„ ํ•˜์ง€ ์•Š๋Š” ํ•œ rustc๊ฐ€ ์ด๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ _prove_ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ํ”„๋กœ์ ์…˜ ๋ฐฉ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ํ˜„์žฌ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹คํ–‰ํžˆ๋„ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„๋“œ ์œ ํ˜•์ด Unpin ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ํ•ญ๋ชฉ์ด ๋ชจ๋‘ ์œ ์ง€๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

  1. Self ์œ ํ˜•์€ Unpin ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ•„๋“œ ์œ ํ˜•์ด ์ˆ˜ํ–‰ ํ•  ๋•Œ ์กฐ๊ฑด๋ถ€๋กœ Unpin ๋งŒ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  2. Self ์œ ํ˜•์€ Drop ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ Self ์œ ํ˜•์˜ ์†Œ๋ฉธ์ž๋Š” ํ•ด๋‹น ํ•„๋“œ์—์„œ ์•„๋ฌด๊ฒƒ๋„ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์–ธ์–ด ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ด๋Ÿฌํ•œ ์กฐ๊ฑด ์ค‘ ์ผ๋ถ€๊ฐ€ ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์˜ˆ : Self ๋Š” Drop ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ์กฐ๊ฑด๋ถ€๋กœ Unpin ๋งŒ ๊ตฌํ˜„ ํ•จ).

์•ˆ์ •๋œ ํŠน์„ฑ ์ธ Drop ๋ฌธ์ œ๋กœ ์ธํ•ด์ด ๋ฌธ์ œ๋Š”์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ๋‚ด๋ฆด ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ฒฐ์ •์ด ์ด๋ฏธ ์กด์žฌํ–ˆ์œผ๋ฉฐ, ์–ธ์–ด ๋ณ€๊ฒฝ ์—†์ด๋Š” ํ•€ ํˆฌ์˜์„ ์ž๋™์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ API์˜ ์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

"ํ•€"๋ณด์ฆ ์ง€์ •

RFC ํ”„๋กœ์„ธ์Šค ํ›„๋ฐ˜์— @cramertj ๋Š” ๊ณ ์ • ๋œ ์ƒ์„ฑ๊ธฐ์— ํ•„์š”ํ•œ ๊ฒƒ ์ด์ƒ์œผ๋กœ ์•ฝ๊ฐ„ ํ™•์žฅํ•˜๋ฉด ๊ณ ์ •์„ ์‚ฌ์šฉํ•˜์—ฌ ์นจ์ž… ๋ชฉ๋ก์˜ ๋ณด์žฅ์„ ์•ˆ์ „ํ•˜๊ฒŒ ์บก์Šํ™” ํ•  ์ˆ˜ ์žˆ์Œ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. Ralf๋Š” ์—ฌ๊ธฐ ์—์ด ํ™•์žฅ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ผ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณ ์ • ๋ณด์žฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PinMut<T> ๊ฐ€ ์žˆ๊ณ  T ์ด Unpin ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ T ๋Š” ์ด๋™๋˜์ง€ ์•Š๊ณ  T ์˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐฑ์—…์€ ์ด๋™๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†Œ๋ฉธ์ž๊ฐ€ T ๋Œ€ํ•ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๋ฌดํšจํ™” ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ "๋ˆ„์ˆ˜ ์ž์œ "์™€ ์ •ํ™•ํžˆ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค. T ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด Rc์ฃผ๊ธฐ ๋’ค์— ๊ฐ‡ํ˜€์„œ ์—ฌ์ „ํžˆ ๋ˆ„์ˆ˜ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ˆ„์ˆ˜ ๋˜๋”๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฌดํšจํ™”๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค (ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ์ข…๋ฃŒ), ์†Œ๋ฉธ์ž๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ๋ณด์žฅ์€ ์Šคํƒ ๊ณ ์ •์„์œ„ํ•œ ํŠน์ • API๋ฅผ ๋ฐฐ์ œํ•˜๋ฏ€๋กœ ์ฒ˜์Œ์—๋Š”์ด๋ฅผ ํฌํ•จํ•˜๋„๋ก ๊ณ ์ •์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹  ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ถ๊ทน์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๋กœ์ด ๋ณด์ฆ์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  1. ์ด ๋งคํฌ๋กœ ์™€ ๊ฐ™์ด ํ›จ์”ฌ ๋” ์ธ์ฒด ๊ณตํ•™์ ์ธ ์Šคํƒ ๊ณ ์ • API๊ฐ€ ๋ฐœ๊ฒฌ๋˜์–ด ๋‹จ์ ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. ์ƒ์Šน์€ ๊ฝค ํฝ๋‹ˆ๋‹ค! ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์นจ์ž… ๋ชฉ๋ก์€ Rust๋ฅผ ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘ ์–ธ์–ด์™€ ํ†ตํ•ฉํ•˜๋Š” josephine ๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋งค์šฐ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. Ralf๋Š” ์ด๋Ÿฌํ•œ API ์ค‘ ์ผ๋ถ€๊ฐ€ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์‹ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค (ํŠนํžˆ "์˜๊ตฌ ์ฐจ์šฉ"์— ๊ธฐ๋ฐ˜ํ•œ API).

API ์žฌ๊ตฌ์„ฑ

๊ทธ๋Ÿฌ๋‚˜ API์— ๋Œ€ํ•œ ๋งˆ์ง€๋ง‰ ์ œ์•ˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์กด์žฌํ•˜๋Š” API๋ฅผ ๊ฒ€ํ†  ํ•œ Ralf & I๋Š” Drop ๋“ฑ๊ณผ ๊ด€๋ จ๋œ ๋†’์€ ์ˆ˜์ค€์˜ ๋ณด์ฆ ๋ฐ ๋ถˆ๋ณ€์„ฑ์„ ์„ค๋ช… ํ•  ์ข‹์€ ์žฅ์†Œ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‚˜๋Š” ์ œ์•ˆํ•œ๋‹ค

  1. ์ƒˆ๋กœ์šด std::pin ๋ชจ๋“ˆ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋ฌธ์„œ๋Š” ๊ณ ์ •์— ๋Œ€ํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ๊ฐœ์š”, ์ œ๊ณตํ•˜๋Š” ๋ณด์ฆ ๋ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์˜ ๊ณ ์ • ์‚ฌ์šฉ์ž๊ฐ€ ์œ ์ง€ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๋†’์€ ์ˆ˜์ค€์˜ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. PinMut ๋ฐ PinBox ๋ฅผ std::mem ๋ฐ std::boxed ์—์„œ pin ๋ชจ๋“ˆ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. std::marker ๋ชจ๋“ˆ์—๋Š” ๋‹ค๋ฅธ ๋งˆ์ปค ํŠน์„ฑ๊ณผ ํ•จ๊ป˜ Unpin ๋ฅผ ๋‚จ๊ฒจ ๋‘ก๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋Ÿฌํ•œ ์œ ํ˜•์˜ ์•ˆ์ •ํ™”๋ฅผ ์™„๋ฃŒํ•˜๊ธฐ ์ „์— ๋” ๊ด‘๋ฒ”์œ„ํ•œ ๋ฌธ์„œ๋ฅผ ์‹ค์ œ๋กœ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Unpin ๊ตฌํ˜„ ์ถ”๊ฐ€

Ralf์™€ ๋‚˜๋Š” ๋˜ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— Unpin ์˜ ๋” ๋งŽ์€ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋„ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. Unpin ๊ตฌํ˜„ํ•  ๋•Œ ํ•ญ์ƒ ์ ˆ์ถฉ์•ˆ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Unpin ๊ฐ€ ํ•„๋“œ ์œ ํ˜•๊ณผ ๊ด€๋ จํ•˜์—ฌ ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„๋˜๋ฉด ํ•ด๋‹น ํ•„๋“œ์— ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ ์ • ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ง€๊ธˆ๊นŒ์ง€ Unpin ๊ตฌํ˜„์— ๋Œ€ํ•ด ๊ทธ๋‹ค์ง€ ๊ณต๊ฒฉ์ ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์›์น™์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฏฟ์Šต๋‹ˆ๋‹ค.

  1. ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•œ ํ•€ ํˆฌ์˜์€ ์ ˆ๋Œ€ ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค (์•„๋ž˜์˜ ๋ฉ”๋ชจ ์ƒ์ž ์ฐธ์กฐ).
  2. ๋‚ด๋ถ€ ๊ฐ€๋ณ€์„ฑ์„ ํ†ตํ•œ ํ•€ ํˆฌ์˜์€ ์ ˆ๋Œ€๋กœ ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ์ž‘์—… ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์œ ํ˜•์€ ํ•€ ํ”„๋กœ์ ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“œ๋Š” ์ž‘์—… (์˜ˆ : Vec ์—์„œ ๋ฐฑ์—… ์ €์žฅ์†Œ ์žฌ ํ• ๋‹น)์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํฌ์ธํ„ฐ ๋’ค ๋˜๋Š” UnsafeCell ๋‚ด์—์„œ ์ผ๋ฐ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋ณด์œ ํ•˜๋Š” std์˜ ๋ชจ๋“  ์œ ํ˜•์— Unpin ์˜ ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์—๋Š” std::collections ๋ชจ๋‘ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋„ˆ๋ฌด ๋ฉด๋ฐ€ํžˆ ์กฐ์‚ฌํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ impls๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ์œ ํ˜•์— ์ถฉ๋ถ„ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

impl<T: ?Sized> Unpin for *const T { }
impl<T: ?Sized> Unpin for *mut T { }
impl<T: ?Sized> Unpin for UnsafeCell<T> { }

ํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ์ž”์†Œ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” Box ํ†ตํ•ด ํˆฌ์˜๋˜๋Š” ํ•€์ด ๊ธฐ์ˆ ์ ์œผ๋กœ ์•ˆ์ „ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค. ์ฆ‰, PinMut<Box<T>> ์—์„œ PinMut<T> ๊ฒƒ์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Box ๊ฐ€ ์ ˆ๋Œ€ ์ž์‹ ์„ ์žฌํ•  ๋‹นํ•˜์ง€ ์•Š๋Š” ์™„์ „ ์†Œ์œ  ํฌ์ธํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

T: Unpin ๋•Œ Box<T> ๋Œ€ํ•ด์„œ๋งŒ Unpin ๊ฐ€ ์กฐ๊ฑด๋ถ€๋กœ ๊ตฌํ˜„๋˜๋„๋ก ๊ตฌ๋ฉ์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์€ ๊ณ ์ •์ด ์ œ์ž๋ฆฌ์— ๊ณ ์ • ๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์— ๊ด€ํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•˜๋ฏ€๋กœ ํฌ์ธํ„ฐ ๊ฐ„์ ‘์„ ํ†ตํ•œ ๋ชจ๋“  ํˆฌ์˜์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์•„์•ผํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ ์ด ๊ฒฐ์ •์„ ์ง€์—ฐํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ์ด๋Ÿฌํ•œ impls๋ฅผ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์ง€๊ธˆ๊นŒ์ง€ ํ•€ API์— ๋งŽ์€ ํˆฌ์ž๋ฅผํ•ด์˜จ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ์ƒ๊ฐ๊ณผ์ด ์•ˆ์ •ํ™” ๊ณ„ํš์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋“ค๋ฆฌ๋Š” ์ง€ ์—ฌ๋ถ€๋ฅผ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์–ธ์–ด ํŒ€์„ ์œ„ํ•ด ํ›„์† ๊ฒŒ์‹œ๋ฌผ์—์„œ fcp ์ œ์•ˆ์œผ๋กœ ๋” ์งง์€ ์š”์•ฝ์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@rfcbot fcp ๋ณ‘ํ•ฉ

์ €๋Š” ์•ฝ๊ฐ„์˜ ์žฌ๊ตฌ์„ฑ ํ›„์— ๊ธฐ์กด ํ•€ API๋ฅผ ์•ˆ์ •ํ™” ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ด์ „ ๊ฒŒ์‹œ๋ฌผ ์—์„œ ๋” ๊ธด ์š”์•ฝ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์˜๊ฒฌ์˜ TL; DR์€ ํ˜„์žฌ API๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • ์†Œ๋ฆฌ
  • ์–ธ์–ด ๋ณ€๊ฒฝ์—†์ด ์–ป๋Š”๋งŒํผ ์ข‹์€
  • ๋” ๋‚˜์€ ์–ธ์–ด ๋ณ€๊ฒฝ๊ณผ ํ˜ธํ™˜ ๊ฐ€๋Šฅ

์šฐ๋ฆฌ๋Š” ์ง€๋‚œ ๋ช‡ ๋‹ฌ ๋™์•ˆ ์ •ํ™•ํ•œ ๋ณด์žฅ ๋ฐ ๊ณ ์ • ๊ณ ์ •์— ๊ด€ํ•œ ๋ชจ๋“  ์ฃผ์š” ์งˆ๋ฌธ์„ ํ•ด๊ฒฐํ–ˆ์œผ๋ฉฐ, ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ํ•˜๊ณ ์žˆ๋Š” ๊ฒฐ์ • (์•ˆ์ •๋˜์–ด์•ผ ํ•  ๊ฒฐ์ •)์€ ๋” ๊ธด ๊ฒŒ์‹œ๋ฌผ์— ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ƒํ™ฉ์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ ์ „์— ๋ช‡ ๊ฐ€์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  1. PinMut ๋ฐ PinBox ๋ฅผ ์ƒˆ๋กœ์šด std::pin ๋ชจ๋“ˆ ์•„๋ž˜์—์„œ ์žฌ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๊ณ ์ • ๋ฐ ๊ณ ์ • ๋ณด์žฅ์— ๋Œ€ํ•œ ๋†’์€ ์ˆ˜์ค€์˜ ๋ฌธ์„œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  2. ํฌ์ธํ„ฐ ๊ฐ„์ ‘ ๋’ค ๋˜๋Š” UnsafeCell ๋‚ด๋ถ€์— ์ผ๋ฐ˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” std์˜ ์œ ํ˜•์— ๋Œ€ํ•ด Unpin ์˜ ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„์„ ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค. ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์ด ์ ์ ˆํ•œ ์ด์œ ๋Š” ๋” ๊ธด ์š”์•ฝ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

@withoutboats ํŒ€์›์ด ์ด๊ฒƒ์„ ๋ณ‘ํ•ฉ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๋‚˜๋จธ์ง€ ํŒ€์˜ ๊ฒ€ํ† ์ž…๋‹ˆ๋‹ค.

  • [] @Kimundi
  • [] @SimonSapin
  • [] @alexcrichton
  • [] @dtolnay
  • [] @sfackler
  • [x] @withoutboats

ํ˜„์žฌ ๋‚˜์—ด๋œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ณผ๋ฐ˜์ˆ˜์˜ ๊ฒ€ํ† ์ž๊ฐ€ ์Šน์ธ (๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Œ)ํ•˜๋ฉด ์ตœ์ข… ๋Œ“๊ธ€ ๊ธฐ๊ฐ„์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์•„์ง ์ œ๊ธฐ๋˜์ง€ ์•Š์€ ์ฃผ์š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

ํƒœ๊ทธ ๋œ ํŒ€์›์ด ๋‚˜์—๊ฒŒ ์ค„ ์ˆ˜์žˆ๋Š” ๋ช…๋ น์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@rfcbot fcp ์ทจ์†Œ

๋‚˜๋Š” ๋˜ํ•œ ์šฐ๋ฆฌ๊ฐ€ ๋‚ด๋ ค์•ผํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ๊ฒฐ์ •์œผ๋กœ ์ธํ•ด lang์„ ํƒœ๊ทธํ•˜๊ณ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” FCP๋ฅผ ์ทจ์†Œํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

@withoutboats ์ œ์•ˆ์ด ์ทจ์†Œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@rfcbot fcp merge ์ด์ „ ๋ณ‘ํ•ฉ ๋ฉ”์‹œ์ง€์™€ ๊ธด ์š”์•ฝ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

@withoutboats ํŒ€์›์ด ์ด๊ฒƒ์„ ๋ณ‘ํ•ฉ ํ•  ๊ฒƒ์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„๋Š” ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๋‚˜๋จธ์ง€ ํŒ€์˜ ๊ฒ€ํ† ์ž…๋‹ˆ๋‹ค.

  • [x] @Kimundi
  • [] @SimonSapin
  • [x] @alexcrichton
  • [] @aturon
  • [x] @cramertj
  • [x] @dtolnay
  • [x] @eddyb
  • [] @joshtriplett
  • [] @nikomatsakis
  • [x] @nrc
  • [] @pnkfelix
  • [x] @scottmcm
  • [] @sfackler
  • [x] @withoutboats

์šฐ๋ ค ์‚ฌํ•ญ :

  • api-refactor (https://github.com/rust-lang/rust/issues/49150#issuecomment-415230837)
  • get_mut_unchecked_mut_mut (https://github.com/rust-lang/rust/issues/49150#issuecomment-417484798)
  • https://github.com/rust-lang/rust/issues/49150#issuecomment -412672704์— ์˜ํ•ด ํ•ด๊ฒฐ ๋œ ๊ต์ฒด

๊ณผ๋ฐ˜์ˆ˜์˜ ๊ฒ€ํ† ์ž๊ฐ€ ์Šน์ธ (๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์Œ)ํ•˜๋ฉด ์ตœ์ข… ๋Œ“๊ธ€ ๊ธฐ๊ฐ„์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ ์•„์ง ์ œ๊ธฐ๋˜์ง€ ์•Š์€ ์ฃผ์š” ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”!

ํƒœ๊ทธ ๋œ ํŒ€์›์ด ๋‚˜์—๊ฒŒ ์ค„ ์ˆ˜์žˆ๋Š” ๋ช…๋ น์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ด๊ฒƒ์ด ์†Œ๋ฆฌ๋ผ๋Š” ํ™•์‹ ์„ ๊ฐ–๊ฒŒ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›๋ž˜ RFC ์ดํ›„ ๋ณ€๊ฒฝ๋œ ๋ชจ๋“  ์‚ฌํ•ญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์•ˆ์ •ํ™”๋ฅผ ์œ„ํ•ด ์ œ์•ˆ ๋œ ์„ค๊ณ„๋ฅผ ๋ฐ˜์˜ํ•˜๋„๋ก RFC ํ…์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? (์ผ๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ๋งŽ์€ RFC๊ฐ€ ์–ป๋Š” ๋ฌธ์ œ์ด๋ฉฐ, ๊ตฌํ˜„ ๊ธฐ๊ฐ„ ๋™์•ˆ ๋„ˆ๋ฌด ๋งŽ์ด ๋ณ€๊ฒฝ๋˜์–ด RFC๋ฅผ ์ฝ์–ด์„œ ํŒŒ์•…ํ•˜๋ ค๋Š” ์‹œ๋„๊ฐ€ ๋ฌด์ตํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.)

RFC๋Š” ์‚ฌ์–‘์ด ์•„๋‹™๋‹ˆ๋‹ค. RFC๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ์‹ค์ œ ๋ฌธ์„œ๋ฅผ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

@bstrie RFC ( Unpin ๋Š” ์•ˆ์ „ํ•จ)์˜ ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์š”์•ฝ ๊ฒŒ์‹œ๋ฌผ์—์„œ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์žฅ๊ธฐ์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์€ ์›๋ณธ RFC๋ฅผ ํŒŒ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ std::pin (์•ˆ์ •ํ™”์— ๋Œ€ํ•œ ์ฐจ๋‹จ๊ธฐ)์˜ ๋ฌธ์„œ๋ฅผ ์ฝ์–ด์„œ ๊ณ ์ • API์— ๋Œ€ํ•ด ์ดํ•ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œํ™”๊ฐ€ ์•ˆ์ •ํ™”๋ฅผ ์ฐจ๋‹จํ•˜์ง€๋งŒ ๋ฌธ์„œ๊ฐ€ ์•„์ง ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์ด FCP๊ฐ€ ์‹œ๊ธฐ์ƒ์กฐ๊ฐ€ ์•„๋‹™๋‹ˆ๊นŒ? ์ž ์žฌ์  ์ธ ๋…ผํ‰์ž๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ์†Œ์Šค๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์ž ์ • ๋ฌธ์„œ๋ฅผ ์Šค์Šค๋กœ ์žฌ๊ตฌ์„ฑ ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒƒ์€ IMO๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ง„์ž… ์žฅ๋ฒฝ์ด ๋” ๋†’์Šต๋‹ˆ๋‹ค.

@bstrie ๋ฌธ์„œํ™” ์ „์— FCP๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ํ‘œ์ค€ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ถ”์  ๋ฌธ์ œ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์€ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผํ•˜๋Š” ํ”Œ๋ ˆ์ด ์ƒํƒœ์— ๋Œ€ํ•œ ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•œ ์š”์•ฝ ์ฃผ์„์„ ์ผ์œผ๋ฉฐ ๊ทธ๋‹ค์ง€ ๋งŽ์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์งง์€ ์ฃผ์„์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด FCP๋Š” "์ด๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ?"๋ผ๋Š” ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋Œ€๋‹ต์ด "์•„๋‹ˆ์˜ค"๋กœ ๋ฐํ˜€์ง€๋ฉด ๋ฌธ์„œ ์ž‘์—…์ด ๋‚ญ๋น„ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. FCP ์™„๋ฃŒ๋Š” ๊ธฐ๋Šฅ์ด ์ฆ‰์‹œ ์•ˆ์ •๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ์•ˆ์ •ํ™”์‹œํ‚ค๊ธฐ์œ„ํ•œ ๊ฒฐ์ •์ด ๋‚ด๋ ค ์กŒ์Œ์„ ์˜๋ฏธํ•˜๊ณ , ์ง€๊ธˆ์ด ๊ทธ๋ ‡๊ฒŒํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ผ์„ ํ•  ๋•Œ์ด๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐ ๋ฌธ์„œ ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

2018 ๋…„ 8 ์›” 2 ์ผ ์˜คํ›„ 12์‹œ 56 ๋ถ„์— boats [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@bstrie ๋ฌธ์„œํ™” ์ „์— FCP๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์šฐ๋ฆฌ์˜ ํ‘œ์ค€ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ถ”์  ๋ฌธ์ œ๋ฅผ ๋”ฐ๋ฅด์ง€ ์•Š์€ ๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ถฉ๋ถ„ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์•ผํ•˜๋Š” ํ”Œ๋ ˆ์ด ์ƒํƒœ์— ๋Œ€ํ•œ ๋งค์šฐ ๊ด‘๋ฒ”์œ„ํ•œ ์š”์•ฝ ์ฃผ์„์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

โ€”
๋Œ“๊ธ€์„ ๋‹ฌ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•œ ํ•€ ํˆฌ์˜์€ ์ ˆ๋Œ€ ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค (์•„๋ž˜์˜ ๋ฉ”๋ชจ ์ƒ์ž ์ฐธ์กฐ).
๋‚ด๋ถ€ ๊ฐ€๋ณ€์„ฑ์„ ํ†ตํ•œ ํ•€ ํˆฌ์˜์€ ์ ˆ๋Œ€๋กœ ์•ˆ์ „ํ•œ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ํ•ด์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ด ์ ์„ ์กฐ๊ธˆ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํŠน๋ณ„ํžˆ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์œ ํ˜• Box ์™€ ์œ ์‚ฌํ•˜๊ฒŒ Mutex ์™€ ๊ฐ™์€ ์œ ํ˜•์€ ์ฝ˜ํ…์ธ ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์†Œ์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ •์„ ๊ณ„ํš ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๋Œ€์—ญ ์™ธ). ์ ์–ด๋„ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™ธ๋ถ€์—์„œ๋Š” PinMut<T> ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์—์„œ .lock() PinRef<InPlaceMux<T>> ์—์„œ PinMut<T> ํ”„๋กœ์ ํŠธํ•˜๋Š” ๋™์‹œ์„ฑ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๊ฐ€์งˆ ์ˆ˜์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์›ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. "๋‚ด๋ถ€ ๊ฐ€๋ณ€์„ฑ์„ ํ†ตํ•œ ํˆฌ์˜"์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ.

@cramertj Mutex ํˆฌ์‚ฌํ•˜๋Š” ๊ฒƒ์€ ์œ„ํ—˜ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. &Mutex ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€ํ™˜ ํ•œ ๋‹ค์Œ Mutex::lock ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ &mut ๋ฅผ ์–ป์€ ๋‹ค์Œ ๋ฌผ๊ฑด์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘ : ์˜ค, ๋‹น์‹ ์€ ํ•ญ์ƒ ๊ณ ์ • ๋œ Mutex ํ•ฉ๋‹ˆ๋‹ค. PinMutex ์ฒ˜๋Ÿผ. ์˜ˆ, ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. &mut ๋ฅผ ์ ˆ๋Œ€๋กœ์ฃผ์ง€ ์•Š์œผ๋ฉด ๋‚ด๋ถ€ ๋ณ€๊ฒฝ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ libstd์— ๊ทธ๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์˜ˆ, ์™„์ „ํ•œ ์ •๋ฐ€๋„๋ฅผ ์œ„ํ•ด @withoutboats '๋ฌธ์„ ์ˆ˜์ •ํ•˜์—ฌ "๋‚ด๋ถ€ ๊ฐ€๋ณ€์„ฑ์„ ํ†ตํ•œ ํ•€ ํˆฌ์˜์€ ์œ ํ˜•์ด ํ•ญ์ƒ ๊ณ ์ •๋˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ ˆ๋Œ€ &mut ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."

@RalfJung ์ •ํ™•ํžˆ ๋งž์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ libstd์— ๊ทธ๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ ๋‚˜ ๋‚ด๋ถ€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์„ ํ†ตํ•ด ํˆฌ์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๋ช…์‹œ๋œ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์ผ๋ฐ˜์ ์ธ ๊ทœ์น™์ด ์•„๋‹Œ libstd์— ๊ด€ํ•œ ๊ฒƒ์ž„์„ ํ™•์ธํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

@cramertj ํ™•์‹คํžˆ ์–ด๋ ต๊ณ  ๋น ๋ฅธ ๊ทœ์น™์€ ์•„๋‹ˆ์ง€๋งŒ (์˜ˆ๋ฅผ ๋“ค์–ด ์œ„๋ฐ˜ํ•˜๋Š” UB๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค) ๋ถˆํ™•์‹คํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ข‹์€ ์ง€์นจ์ด๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค

์ด๊ฒƒ์„ ์•ˆ์ •ํ™”ํ•˜๊ธฐ๋กœ ํ•œ ๊ฒฐ์ •์— ์‹ค๋งํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์›์ด ์—†์œผ๋ฉด ์ž ์žฌ์  ์ธ ๋””์ž์ธ์ด ์•ฝ๊ฐ„ ์—‰๋ง์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ๊ธฐ์ ์œผ๋กœ ์ผ์–ด๋‚˜๋Š” ์ผ์— ๋Œ€ํ•ด ์ง€๋‚˜์น˜๊ฒŒ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์žฅ๊ธฐ์ ์œผ๋กœ Rust๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ๊ณ ์ • ์œ ํ˜•์„ ์–ป๋Š”๋‹ค๋ฉด &self ๋ฐ &mut self ํ—ˆ์šฉํ•˜๋Š” ํŠธ๋ ˆ์ด ํŠธ ๋ฉ”์„œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ํ•œ ์ง„์ •ํ•œ ์ผ๋ฅ˜๋ผ๊ณ  ๋Š๊ปด์ง€์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ณ ์ • ์„ฑ์€ ์ฐธ์กฐ ์œ ํ˜•์ด ์•„๋‹ˆ๋ผ ์ฐธ์กฐ ์œ ํ˜•์˜ ์†์„ฑ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ๊ณ ์ • ์œ ํ˜•์— ๋Œ€ํ•œ ํ–ฅํ›„ ๋””์ž์ธ์—์„œ ์—ฌ์ „ํžˆ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” Pin<T> ์ค‘๋ณต๋˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ถ€ ๊ธฐ๋ณธ &pin T ๋Œ€ํ•ด ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ„์นญ ์ผ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋‘ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฐจ๋ก€๋กœ, Pin<Self> ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” Future (๋ฐ ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋งŽ์€ ๊ฒƒ)๊ณผ ๊ฐ™์€ ํŠน์„ฑ์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผํ•˜๋ฏ€๋กœ ๋ณต์žกํ•œ ์ „ํ™˜ ๊ธฐ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ถˆ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์€ ์ง€์ €๋ถ„ํ•œ. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๋‚˜์น˜๊ฒŒ ๋น„๊ด€์  ์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์œ„ํ—˜์„ ๊ฐ์ˆ˜ํ•˜๋ฉด์„œ ๊ทธ๋Ÿฌํ•œ ์ „ํ™˜์„ ํ”ผํ•˜๋ ค๋Š” ์š•๊ตฌ๊ฐ€ ํ–ฅํ›„ ๊ฒฐ์ •์„ ๊ธฐ๋ณธ ๊ณ ์ • ์œ ํ˜•์˜ ๊ธฐ์ดˆ๋กœ ๋Œ€์‹  &pin ๋ฅผ ์ฑ„ํƒํ•˜๋Š”์ชฝ์œผ๋กœ ํŽธํ–ฅ ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ฑฑ์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜๊ตฌ์ ์œผ๋กœ ์ด๋“ฑ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ €๋Š” ์—ฌ์ „ํžˆ ๋‹จ๊ธฐ์ ์ธ ๋””์ž์ธ ์ค‘์—์„œ &Pinned<T> ์ ‘๊ทผ ๋ฐฉ์‹์ด ์‹คํ˜„ ๊ฐ€๋Šฅํ–ˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํฌ์›Œ๋“œ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๊ณ  ๋‹ค๋ฅธ ์ด์ ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค (์˜ˆ : ๋‚ด๋ถ€ ๊ฐ€๋ณ€์„ฑ ๋ฌธ์ œ๋ฅผ ์™„์ „ํžˆ ํšŒํ”ผ).

์˜ค ์ž˜. ๊ทธ๋Œ€๋กœ, ๋‚˜๋Š” ์—ฌ์ „ํžˆ Pin ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ณ ๋Œ€ํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ๋ณด๋‹ค crates.io์— ๋จธ๋ฌผ๋ €๋‹ค๋ฉด ๋” ์„ ํ˜ธํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์•ˆ์ • ์‹œํ‚ค๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ด๋ฅด๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ ํ•„๋“œ์— ์•ก์„ธ์Šค ํ•  ๋•Œ ํ˜„์žฌ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ๋‹ค์†Œ ์–ด์ƒ‰ !Unpin ํ˜ธ์ถœ ๋ฐฉ๋ฒ• ๋‚ด๋ถ€ ์œ ํ˜•์„ PinMut<Self> . @withoutboats ๋ณ€๊ฒฝ์ด ์ƒํ™ฉ์„ ๊ฐœ์„  ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๊ณ  ์ ์–ด๋„ ์ž ์‹œ ๋™์•ˆ ํ…Œ์ŠคํŠธ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@Thomasdezeeuw ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ์ƒํ™ฉ์„ ๊ฐœ์„  ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ

์ผ๋ฐ˜์ ์ธ ์†”๋ฃจ์…˜์„ ์ž‘์„ฑํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, std์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ futures์˜ ๋งคํฌ๋กœ ๋ณ€ํ˜•์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

macro_rules! get_mut {
    ($f:tt: $t:ty) => (
        fn $f<'a>(
            self: &'a mut std::mem::PinMut<Self>
        ) -> &'a mut $t
            where $t: Unpin
        {
            unsafe {
                 &mut std::mem::PinMut::get_mut_unchecked(self.reborrow()).$f
            }
        }
    )
}

struct Foo {
    bar: Bar,
}

impl Foo {
     get_mut!(bar: Bar);
}

@withoutboats Unpin ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋งŒ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

@RalfJung ์ •ํ™•ํžˆ! where ์ ˆ ์ค„์€ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

@withoutboats ๋Š” ์ข‹์€ ๋งคํฌ๋กœ์ด์ง€๋งŒ Unpin ์œ ํ˜•์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜์ด ๊ฑธ๋ฆด ๋ฐฉ๋ฒ• / ๋งคํฌ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค PinMut<Self> ๋ฐ˜ํ™˜ PinMut<Self.field> , ๋ฐ”๋žŒ์งํ•˜๊ฒŒ๋Š” ์•ˆ์ „ ์ฝ”๋“œ๋ฅผ. ์ œ๊ฐ€ ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋‚ด ์ƒ๊ฐ์€ ๋ฐœ์‹ ์ž guarentees๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒฝ์šฐ์ด๋‹ค Self ๊ณ ์ •๋˜์–ด, ๋‹ค์Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค Self.field , ๋งž์ฃ ? Unpin ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š” ์œ ํ˜•์—์„œ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

@Thomasdezeeuw ์ด ๋ฌธ์ œ๋Š” "ํ•€ ํ”„๋กœ์ ์…˜"์„น์…˜์˜ ์š”์•ฝ์—์„œ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Self ๊ฐ€ ๊ฒ€์‚ฌ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜์—†๋Š” ํŠน์ • ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” ํ•œ !Unpin ํ•„๋“œ์— ํ”„๋กœ์ ์…˜ํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Unpin ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ํ•„๋“œ์— ํ”„๋กœ์ ์…˜ํ•˜๋Š” ๊ธฐ๋Šฅ ๋งŒ ์ž๋™์œผ๋กœ ๋ณด์žฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (ํ•ญ์ƒ ์•ˆ์ „ํ•˜๊ณ  where ์ ˆ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

@withoutboats ์š”์•ฝ์„ ์ฝ์—ˆ์ง€๋งŒ ์˜คํ•ดํ–ˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ T ์œ ํ˜•์ด !Unpin ์ด๋ฉด PinMut<T> ๋Š” DerefMut for T ๊ตฌํ˜„ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ ์—†์ด๋Š” ๊ฐ’์„ ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Drop ํŠธ๋ ˆ์ด ํŠธ์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์œ ํ˜•์˜ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ T.field ์ด !Unpin ์ด๋”๋ผ๋„ PinMut<T> ์—์„œ PinMut<T.field> ๋กœ์˜ ๋งคํ•‘์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@Thomasdezeeuw futures-rs์—๋Š” PinMut ์•ˆ์— ์œ ํ˜•์ด ์žˆ์ง€๋งŒ ํ•ด๋‹น ํ•„๋“œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ณ ์ • ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š๋Š” ์ƒํ™ฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@withoutboats ์˜ ๋งคํฌ๋กœ์˜ ๋‹จ์ ์€ self ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ•„๋“œ์—๋งŒ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ํ•„๋“œ ์•ก์„ธ์Šค์—๋Š”์ด ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.

๊ณ ์ • API๋ฅผ ์•ˆ์ •ํ™”ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ œ์•ˆ ๋œ core::pin ๋ชจ๋“ˆ์„ ๋จผ์ € ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

Drop ํŠน์„ฑ์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์œ ํ˜•์˜ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํฝ๋‹ˆ๋‹ค.

์•„๋‹ˆ์—์š”. Drop ์€ ํ•„๋“œ ๋งคํ•‘์„ํ•˜์ง€ ์•Š๋Š” ํ•œ ์‹ค์ œ๋กœ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•„๋“œ ๋งคํ•‘์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ด์œ ์ž…๋‹ˆ๋‹ค.

Drop ํŠน์„ฑ์— ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์œ ํ˜•์˜ ํ•„๋“œ์— ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ํฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ PinMut์—์„œ ๋งคํ•‘์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.PinMut๋กœT.field๊ฐ€! Unpin ์ธ ๊ฒฝ์šฐ์—๋„ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ช…ํ™•ํžˆํ•˜๊ธฐ ์œ„ํ•ด T: !Unpin ๋Œ€ํ•œ ์ฆ๋ช…์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋”๋ผ๋„ Drop impl์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ์˜ˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

struct Foo {
    field: UnpinFuture,
}

impl Foo {
     fn field(self: PinMut<Self>) -> PinMut<UnpinFuture> { ... }

     fn poll_field(self: PinMut<Self>, ctx: &mut Context) {
         self.field().poll(ctx);
     }
}

impl Drop {
    fn drop(&mut self) {
        // ...
        let moved_field = mem::replace(&mut self.field, UnpinFuture::new());

        // polling after move! violated the guarantee!
        PinBox::new(moved_field).as_pin().poll();
    }
}

@RalfJung์ด ๋งํ–ˆ๋“ฏ์ด ์ด๊ฒƒ์€ Drop ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. !Unpin ํ•„๋“œ์— ํ•€ ํ”„๋กœ์ ์…˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉด Drop ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ž‘์—…์ด ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

@withoutboats ๋งคํฌ๋กœ์˜ ๋‹จ์ ์€ self์— ๋Œ€ํ•œ ๊ฐ€๋ณ€ ์ฐธ์กฐ๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ•„๋“œ์—๋งŒ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ํ•„๋“œ ์•ก์„ธ์Šค์—๋Š”์ด ์ œํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ํ•„๋“œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ด€์‹ฌ์žˆ๋Š” ๊ฐ ์กฐํ•ฉ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ๊ธฐ์‹ฌ์œผ๋กœ ์ธํ•ด ๋ฏธ๋ž˜ ์™ธ์— ๋‹ค๋ฅธ ๊ตฌ์ฒด์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์ ์–ด๋„ ์ง€๊ธˆ (๋‚˜์ค‘์— ๋” ๋งŽ์€ ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ๊ฒƒ๊ณผ๋Š” ๋ฐ˜๋Œ€๋กœ) ์•ˆ์ •ํ™”ํ•˜๋ ค๋Š” ์š•๊ตฌ๋ฅผ ์ž๊ทนํ•˜๋Š” ๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

@comex๊ฐ€ ์ œ๊ธฐ ํ•œ ์š”์ ์— ๋Œ€ํ•ด์„œ๋Š” ์—ฌ๊ธฐ์—์„œ ๋” ์ด์ƒ์˜ ๋…ผ์˜๊ฐ€์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฐธ์กฐ ๋Œ€์‹ ์— pin ์œ ํ˜•์˜ ์†์„ฑ์œผ๋กœ ๋งŒ๋“œ๋Š” ์•„์ด๋””์–ด๊ฐ€ ๊ธฐ์–ต ๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋“ค์€ ์ €๋ฅผ ๊ฝค ๊ถ๊ธˆํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฏธ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋…ผ์˜ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? "์™ธ๋ถ€"์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ตœ์„ ์„ ๋‹คํ•ฉ๋‹ˆ๋‹ค ;-)

์ฐจ๋ก€๋กœ Pin์„ ํ—ˆ์šฉํ•˜๋Š” Future (๋ฐ ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋งŽ์€)์™€ ๊ฐ™์€ ํŠน์„ฑ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ํ•„์š”๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ณต์žกํ•œ ์ „ํ™˜ ๊ธฐ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ . ์ผ๋ถ€ ์—๋””์…˜ ๊ด€๋ จ ๋งˆ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด์ด Pin ๋ฅผ ์ž๋™์œผ๋กœ ๋ž˜ํ•‘ ๋ฐ ๋ž˜ํ•‘ ํ•ด์ œํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์™„์ „ํžˆ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์†Œ ์ด์ฒด์ ์ด์ง€๋งŒ ๊ณผ๋„ํ•˜์ง€๋Š” ์•Š์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์ „ํ™˜ ์ค‘์— ์–ธ์–ด์™€ API๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ด ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ์•„์ด๋””์–ด๋ฅผ ๋” ๊ตฌ์ฒดํ™”ํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค (์ด์ „์— ์Šค๋ ˆ๋“œ์—์„œ ์ œ๊ธฐ ๋œ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ง€๋งŒ ์–ด๋”” ์žˆ๋Š”์ง€ ์ถ”์ ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค).

@yasammez ์ €๋Š” ์—ฌ๊ธฐ ์—์„œ ๊ฐ€์น˜ ์ง€ํ–ฅ์  ๊ณ ์ •์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ์„ ํƒํ•  ์ˆ˜์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์•ˆ์ •ํ™” ๊ฒฝ๋กœ์— ์•ˆ์ „ํ•œ ํ˜„์žฅ ํˆฌ์˜ ๊ณ„ํš์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋ชจ๋“  ๋ฏธ๋ž˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ๋„์ž… ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์ƒ ์ˆ˜๋™ Future impls๋Š” ๋“œ๋ฌธ ์ผ์ด ์•„๋‹ˆ๋ฉฐ ๋‚ด ๋ชจ๋“  ๊ฒƒ์ด ํ•„๋“œ ํด๋ง์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์˜ ๋Œ€๋ถ€๋ถ„์ด ์‚ฌ์†Œํ•˜๊ฒŒ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์ž…์ฆ๋˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์˜ ์กด์žฌ๋งŒ์œผ๋กœ๋„ ์‹ค์ œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๊ฐ์‚ฌ ํ•  ์ˆ˜์žˆ๋Š” ๋Šฅ๋ ฅ์ด ํฌ์„๋ฉ๋‹ˆ๋‹ค.

๊ฐ€๊นŒ์šด ์‹œ์ผ ๋‚ด์—

  1. Futures ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœ ํ•œ unsafe_pinned ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋‚ด๋ถ€ ํด์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.์ด ๋งคํฌ๋กœ๋Š” ๋‚ด ๊ธด ์š”์•ฝ์— ์„ค๋ช… ๋œ ์ œ์•ฝ ์กฐ๊ฑด์— ๋Œ€ํ•ด ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค (๋งคํฌ๋กœ ๋ฐ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ์ ‘๊ทผ์ž๋ฅผ ์†์œผ๋กœ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค. ๋‹จ ํ•˜๋‚˜์˜ unsafe ).
  2. !Unpin ์„ ๋ฌผ์„ ํž™ ํ• ๋‹นํ•˜๋Š” ๋Œ€์‹  ํ•„๋“œ์—์„œ Unpin ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ด๋Ÿฌํ•œ ํ”„๋กœ์ ์…˜์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•ˆ์ „ํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๋„๋กํ•ฉ๋‹ˆ๋‹ค.

@yasammez ์ด ์Šค๋ ˆ๋“œ์—์„œ ์ž์„ธํžˆ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค : https://internals.rust-lang.org/t/can-pin-own-its-referent-instead-of-borrowing-mutably/7238/20

@withoutboats ๋‚˜๋Š” ์˜ต์…˜์„ ์ดํ•ดํ•˜์ง€๋งŒ ์ž…๋ง›์ด ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์„ Unpin ์š”๊ตฌํ•˜๋ฉด ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๋น„๋™๊ธฐ fn๊ณผ ๊ฐ™์ด ์ž์ฒด ๋นŒ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ๊ณผ ๊ฐ™์ด ์ „์ฒด ๋ฏธ๋ž˜์™€์˜ ํ˜ธํ™˜์„ฑ์ด ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์˜ค์—ผ์€ ์ง„์ •ํ•œ ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ €๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ futures 0.3์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์œผ๋ฉฐ ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Œ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

@tikue ์ด๊ฒƒ์€ ์ž๋™ํ™” ๋œ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ‘œ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์•„์ง ์™„์ „ํžˆ ์„ค๊ณ„ํ•˜๊ฑฐ๋‚˜ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐฐ์ œํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š”์ด ์šฐ๋ ค๋ฅผ ์ •๋ง๋กœ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์˜ค์—ผ์€ ์ง„์ •ํ•œ ๊ด€์‹ฌ์‚ฌ์ž…๋‹ˆ๋‹ค.

"์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฌธ์ œ"๋Š” ๋‚ด๊ฐ€ ๋Š๋ผ๋Š”์ด ์ˆ˜์ค€์— ๋„ˆ๋ฌด ์ž์ฃผ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. unsafe ์— ๋Œ€ํ•œ ํฌ๊ด„์  ์ธ ๊ธˆ์ง€์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ค‘์ฒฉ ์„ ๋ฌผ์˜ ๊ฒฝ์šฐ unsafe_pinned! ๋งคํฌ๋กœ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋‚˜๋Š” ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด Unpin ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  ๋Œ€์‹  auto trait impl์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค.
  2. ์‚ฌ์šฉ์ž ์ง€์ • ์†Œ๋ฉธ์ž๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ๋ž˜๋ฅผ ์œ„ํ•ด Drop ๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  3. ํˆฌ์‚ฌํ•˜๋ ค๋Š” ํ•„๋“œ๋Š” ๋น„๊ณต๊ฐœ์ž…๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ : ๋‹น์‹ ์€ ์ข‹์Šต๋‹ˆ๋‹ค! unsafe_pinned๋Š” ์‚ฌ์šฉํ•˜๊ธฐ์— ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™์œผ๋กœ ๊ตฌํ˜„ ์•Š์€ ๊ฒฝ์šฐ Unpin ๋˜๋Š” Drop , ๋‹น์‹ ์ด ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด์•ผํ•˜์ง€๋งŒ, ์‹ฌ์ง€์–ด ๊ทธ ๊ฒฝ์šฐ๋Š” ๋ฐ˜๋“œ์‹œ ์ด๋Ÿฌํ•œ ์–ด๋ ค์šด ๋ฌธ์ œ :

  1. Unpin ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด Unpin ์ถ”์ƒํ™”ํ•˜๋Š” ๋ฏธ๋ž˜์— ์ œ์•ฝ์„๋ฐ›์Šต๋‹ˆ๋‹ค.
  2. Drop ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด ์†Œ๋ฉธ์ž ๋™์•ˆ ํ“จ์ฒ˜ ํ•„๋“œ๋ฅผ ์ด๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ๋ฅผ ์œ„ํ•ด @tikue , ์†์„ฑ ๊ธฐ๋ฐ˜ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œ์•ˆ ์˜

์ ์ ˆํ•œ &pin ์ฐธ์กฐ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š”๋ณด๋‹ค "์นจํˆฌ์ ์ธ"์†”๋ฃจ์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ œ์•ฝ ์กฐ๊ฑด ์ธก๋ฉด์—์„œ ๋™์ผํ•œ ๋ชจ์–‘์„ ๊ฐ–์ง€๋งŒ ์–ธ์–ด ์ „์ฒด์— ๋” ์˜ํ–ฅ์„์ค๋‹ˆ๋‹ค.

PinMut::replace ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

impl<'a, T> PinMut<'a, T> {
  pub fn replace(&mut self, x: T) { unsafe {
    ptr::drop_in_place(self.inner as *mut T);
    ptr::write(self.inner as *mut T, x);
  } }
}

์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์—†๋‹คํ•˜๋”๋ผ๋„, ์šฐ๋ฆฌ๋Š”์ด ์•ˆ์ „ํ•œ์ง€ ์—ฌ๋ถ€์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์ด ์žˆ์–ด์•ผ -์— ๋Œ€ํ•œ PinMut , ๋˜ํ•œ ์œ„ํ•ด PinBox ๋น„์Šทํ•œ์„ ๊ฐ€์งˆ ์ˆ˜์žˆ๋‹ค.

PinBox ์—๋Š” ํ™•์‹คํžˆ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์†Œ๋ฉธ์ž๋ฅผ "in place"๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ฐ€์น˜๊ฐ€ ์กฐ๊ธฐ์—, ์ฆ‰ ์ˆ˜๋ช…์ด ๋๋‚˜๊ธฐ ์ „์— ํ•˜๋ฝํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด PinMut ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ๊ฑฑ์ •๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํ•ญ์ƒ ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์ด ๋ถ„๋ช…ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ฐ˜๋ก€๋ฅผ ์ œ์‹œ ํ•  ์ˆ˜๋„ ์—†์Šต๋‹ˆ๋‹ค. ํŠธ์œ— ๋‹ด์•„ ๊ฐ€๊ธฐ @cramertj @withoutboats ์–ด๋–ค ์ƒ๊ฐ?

(ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด @rfcbot์— ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค ...)

@rfcbot ์šฐ๋ ค ๊ต์ฒด

@RalfJung ๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ ํ‹€๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ T ํŒจ๋‹‰์ด ๋ฐœ์ƒํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋‘ ๋ฒˆ ๋–จ์–ด์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

@RalfJung ์ด๋ฏธ PinMut::set ์žˆ์Šต๋‹ˆ๋‹ค.

@cramertj ๋„์šฐ. ๊ทธ๋ž˜ ๊ทธ๋ž˜ ๋‚ด๊ฐ€ ์ข€ ๋” ์ฒ ์ €ํžˆ ํ™•์ธํ–ˆ์„ ์ˆ˜ ์žˆ์—ˆ์–ด.

์†Œ์Œ์— ๋Œ€ํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ ค ์‚ฌํ•ญ์ด ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@rfcbot ํ•ด๊ฒฐ ๊ต์ฒด

์ด๊ฒƒ์€ ์„ ๋ฌผ 0.1 => 0.3 tokio_timer::Deadline ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ง€๊ธˆ ์ž‘์„ฑ์ค‘์ธ ์‹ค์ œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. PinMut<Future01CompatExt<Delay>> ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Delay ๋Š” Deadline ํ•„๋“œ์ž…๋‹ˆ๋‹ค.

        let mut compat;
        let mut delay = unsafe {
            let me = PinMut::get_mut_unchecked(self);
            compat = Future01CompatExt::compat(&mut me.delay);
            PinMut::new_unchecked(&mut compat)
        };

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์‚ฌ์†Œํ•œ ์‚ฌ์šฉ ์™ธ์—๋„ ์ปดํŒŒ์ผ ๋œ ๋ฒ„์ „์„ ์ฐพ๊ธฐ ์œ„ํ•ด์ด ์ฝ”๋“œ๋ฅผ ์•ฝ 5 ๋ฒˆ ๋ฐ˜๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ๊ธ€์„ ์“ฐ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์€ ์ธ์ฒด ๊ณตํ•™์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๊ฒƒ์— ๋Œ€ํ•œ ์ „๋ฉด์  ์ธ ๊ธˆ์ง€์™€์ด ์ฝ”๋“œ ์‚ฌ์ด์—๋Š” ๋งŽ์€ ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด map_unchecked ๋Š” ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—์ด ์ฝ”๋“œ๋ฅผ ์ง€์›ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ œํ•œ์ ์ด์ง€๋งŒ์ด ์ฝ”๋“œ์—์„œ๋Š” Future01CompatExt<&mut Delay> ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํŽธ์ง‘ : Unergonomy์˜ ๋˜ ๋‹ค๋ฅธ ์†Œ์Šค๋Š” ๋งค์น˜ ๊ฐ€๋“œ์—์„œ ๊ฐ€๋ณ€์ ์œผ๋กœ ๋นŒ๋ฆด ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— PinMut๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์ž‘์—… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

```๋…น
self.poll_listener (cx)์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๊นŒ? {
// self.open_connections> 0 ์ธ ๊ฒฝ์šฐ
Poll :: Ready (None) if self.open_connections ()> 0 => {
^^^^ ํŒจํ„ด ๊ฐ€๋“œ์—์„œ ๊ฐ€๋ณ€์ ์œผ๋กœ ๋นŒ๋ ค
return Poll :: Pending;
}
์„ค๋ฌธ ์กฐ์‚ฌ :: ์ค€๋น„ (์—†์Œ) => {
return Poll :: Ready (None);
}
}
````

map_unchecked์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ์€ ์ •์ ์— ์žˆ์œผ๋ฉฐ ํฌ์ธํ„ฐ ์ฃผ์œ„์— ์ž„์‹œ ๋ฐ˜ํ™˜์„ ํ—ˆ์šฉ ํ•  ์ˆ˜์žˆ๋Š”๋ณด๋‹ค ์ผ๋ฐ˜์ ์ธ ์„œ๋ช…์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PinMut<Type> ์˜ ํ•„๋“œ์—์„œ &mut ์ฐธ์กฐ๋ฅผ ์–ป๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ์‹œ๊ธฐ์— ๋Œ€ํ•œ ์ง€์นจ์ด ์žˆ์Šต๋‹ˆ๊นŒ? Type ํ•„๋“œ๊ฐ€ ๊ณ ์ •๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ ๊ดœ์ฐฎ์Šต๋‹ˆ๊นŒ? ๋น„๊ณต๊ฐœ ์—ฌ์•ผํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ, ํ•„๋“œ๊ฐ€ Unpin ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํ•„๋“œ์˜ PinMut ๋ฅผ ๊ตฌ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@rfcbot ๋ถ„์‚ฐ

๋‚˜๋Š” ์ƒ๋‹นํ•œ ์–‘์˜ PinMut ๊ธฐ๋ฐ˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š”๋ฐ ํ•œ ๊ฐ€์ง€ ๋งŽ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ๊ณ ์ •์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ์ž‘์—…์„ํ•˜๊ณ  ์žˆ์ง€๋งŒ PInMut ์˜ํ•ด ์Šค์Šค๋กœ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. &mut ๋ณด๋‹ค๋Š” "๋‚˜๋Š”์ด ๊ธฐ์–ต์—์„œ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ฒ ๋‹ค๊ณ  ์•ฝ์†ํ•œ๋‹ค." ๊ทธ๋Ÿฌ๋‚˜ ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ์ • ๋œ ๊ฐ’์„ ๊ฐ–๊ฒŒ๋˜๋ฏ€๋กœ ๋ถˆํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๊ณ  ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ข‹์€ API๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์ง€๋งŒ, "๊ณ ์ • ๋  ๋‚˜์˜ ์ฃผ์žฅ์ด ํ•„์š”ํ•˜๋‹ค"์™€ "๊ณ ์ • ๋œ ๊ฒƒ์œผ๋กœ ์ž‘์—… ํ•  ์ˆ˜์žˆ๋‹ค"๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋…ผ์˜".

์ €๋Š” "๋ณ€์ด"๊ฐ€ ์ž˜๋ชป๋œ ์šฉ์–ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์ฐธ์กฐ ์œ ํ˜•์— ๋Œ€ํ•ด ์ถ”์ƒํ™”ํ•˜๋Š” ์—ฐ๊ด€๋œ ์œ ํ˜• ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค.

@RalfJung ๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” PinMut ๋˜๋Š” & mut์—์„œ ์˜ฌ ์ˆ˜์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์œ ํ˜•์— ๋งŒ์กฑํ•˜์ง€๋งŒ PinMut์ฒ˜๋Ÿผ ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์ด ํŠนํžˆ ์ž˜ ํ™•์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ์ž„์˜์˜ _self_types๋ณด๋‹ค ๋” ์„ฑ์ทจ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. : smile : ์•„๋งˆ๋„ "์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ํ•˜๋Š” ์„œ๋ช…์„ ๋ฏธ๋ž˜์— ๋Œ€๋น„ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๋‹นํžˆ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค"๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

impl MyType {
    fn foo(self: impl MutableRef<Self>, ...) { ... }
}

@rfcbot ์šฐ๋ ค API ๋ฆฌํŒฉํ„ฐ๋ง

์•ฝ๊ฐ„์˜ ์˜๊ฐ์„๋ฐ›์€ ๊ตฌ์กฐ์ฒด์™€ ์–ด์ ฏ๋ฐค์— ์ €๋Š”์ด API๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ๋ชจ๋“  ๋‹จ์ผ ํฌ์ธํ„ฐ์˜ ๊ณ ์ • ๋œ ๋ฒ„์ „์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ํฌ์ธํ„ฐ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” Pin ์œ ํ˜•์ด ํ•˜๋‚˜๋งŒ ์žˆ๋„๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„ ๋ƒˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ค ์‹ ์œผ๋กœ๋“  API์˜ ๊ทผ๋ณธ์ ์ธ ์žฌ๊ตฌ์„ฑ์€ ์•„๋‹ˆ์ง€๋งŒ "๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •"๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์กฐ๊ฐ์œผ๋กœ ๋Œ์–ด๋‚ด๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

nt-rs ์˜ ๋„คํŠธ์›Œํฌ ์Šคํƒ์—์„œ ์ž‘์—… ํ•  ๋•Œ ๊ณ ์ • ๋œ ์ฐธ์กฐ๊ฐ€ ์—ฌ๊ธฐ ์—์„œ ๋ณผ ์ˆ˜์žˆ๋Š” fold ๋กœ ํ˜„์žฌ ํ•ด๊ฒฐ์ค‘์ธ "์†Œ์œ ๊ถŒ ๋Œ„์Šค"์— ๋„์›€์ด๋œ๋‹ค๊ณ  ๋“ค์—ˆ ์Šต๋‹ˆ๋‹ค (tx.send๊ฐ€ tx๋ฅผ Send<<type of tx>> ๋ฏธ๋ž˜, ํŒจํ‚ท์„ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณตํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.). ๊ณ ์ •์ด ๊ทธ๋Ÿฐ ์ผ์— ์–ด๋–ค ๋„์›€์ด ๋ ๊นŒ์š”?

@Redrield send() ๋Š” ์„ ๋ฌผ์—์„œ &mut ๋ณธ์ธ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค .0.3 .

@withoutboats ์ €๋Š” futures-rs์—์„œ์ด ์ƒˆ๋กœ์šด API๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

์ƒˆ API๋Š” ๋‹ค๋ฅธ ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ API๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‘ API๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์งง์€ ์ „ํ™˜ ๊ธฐ๊ฐ„์„ ๊ฐ–๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.์ด๋ฅผ ํ†ตํ•ด ์‹คํ—˜ํ•˜๊ณ  PR์„ ์ค€๋น„ํ•˜๊ณ  libcore์˜ futures API๋ฅผ ์ƒˆ๋กœ์šด ์Šคํƒ€์ผ๋กœ ์ด์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@MajorBreakfast ์ž ์žฌ์ ์œผ๋กœ type PinMut<T> = Pin<&mut T>; ๋ณ„์นญ์„ ์ง€์ •ํ•˜๊ณ  ๋™์ผํ•œ ๋ฐฉ๋ฒ•์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ œ๊ณต ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ํŒŒ์†์˜ ๊ทœ๋ชจ์™€ ์ฆ‰๊ฐ์ ์ธ ๋ฌธ์ œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด :

  1. Pin<&T> ๋ฐ Pin<&mut T> ์—๋Š” "ํ‘œ์ค€ ๊ณ ์ •"๋ถˆ๋ณ€์ด ์žˆ์œผ๋ฉฐ ๊ทธ ๋’ค์—์žˆ๋Š” ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
    1.a. Unpin ์•„๋‹ˆ๋ฉด ๋” ์ด์ƒ ์œ ํšจํ•œ &T / &mut T ์ด (๊ฐ€) ์•„๋‹™๋‹ˆ๋‹ค.
    1.b. ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์—์„œ Pin ๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    1.c. ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ฌดํšจํ™”๋˜๊ธฐ ์ „์— ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  2. Pin<Smaht<T>> ์ด ์œ ํšจ ๋ฐ˜ํ™˜ ์ œ์™ธํ•˜๊ณ ๋Š” "ํŠน๋ณ„ํ•œ"๋ณด์žฅ์ด์—†๋Š” Pin<&mut T> ๋ฐ Pin<&T> API๋Š” ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ฃผ์–ด, ๋‹จ์ง€ ํ‘œ์ค€ ์•ˆ์ „ ๋ณด์žฅ์ด๋‹ค (๋ฌผ์—ˆ์„ ๋•Œ ).
    2.a. ์šฐ๋ฆฌ๋Š” ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ DerefPure ๋ณด์ฆ, Pin<Smaht<T>> ์ด ๋ณ€์ดํ•˜์ง€ ์•Š๋Š” ํ•œ ๋™์ผํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ˆ„๊ตฌ๋“ ์ง€ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ถˆ๋ณ€์— ๋Œ€ํ•œ ์ˆ˜์ •.

Pin<Smaht<T>> ์˜ ๋ถˆ๋ณ€์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Deref::deref(&self.inner) ์ „ํ™”ํ•˜๋ฉด ์œ ํšจํ•œ Pin<&T::Target> ( &self.inner ๊ฐ€ ์•ˆ์ „ํ•œ &Smaht<T> ํ•„์š”๋Š” ์—†์Œ).
  2. Smaht<T>: DerefMut ์ด๋ฉด DerefMut::deref_mut(&mut self.inner) ํ˜ธ์ถœํ•˜๋ฉด ์œ ํšจํ•œ Pin<&mut T::Target> ( &mut self.inner ๋Š” ์•ˆ์ „ํ•œ &mut Smaht<T> ํ•„์š”๋Š” ์—†์Œ).
  3. ํŒŒ๊ดดํ•˜๊ธฐ ์œ„ํ•ด self.inner ์˜ ์†Œ๋ฉธ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ํŒŒ๊ดดํ•˜๊ธฐ์— ์•ˆ์ „ํ•œ ํ•œ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
  4. self.inner ๋Š” ์•ˆ์ „ํ•œ Smaht<T> ์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@withoutboats ์ œ์•ˆ์— ๋Œ€ํ•œ reddit ๊ฒŒ์‹œ๋ฌผ ์— ๋ช‡ ๊ฐ€์ง€ ํ”ผ๋“œ๋ฐฑ์ด ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • (๋ณต์ˆ˜) Own ์€ ์ด์ƒํ•œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋Š” ๊ฐ€๋Šฅํ•œ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • ryani ๋Š” Deref<Target = T> ๋ฅผ ์ œํ•œํ•˜๋Š” ๊ตฌํ˜„์— ์ถ”๊ฐ€ ์ผ๋ฐ˜ T ๊ฐ€์žˆ๋Š” ์ด์œ ๋ฅผ ๋ฌป์Šต๋‹ˆ๋‹ค. P::Target ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

  • jnicklas ๋Š” Own ํŠน์„ฑ์˜ ๋ชฉ์ ์ด ๋ฌด์—‡์ธ์ง€ ๋ฌป์Šต๋‹ˆ๋‹ค. ๊ด€๋ก€์— ๋”ฐ๋ผ pinned ๊ณ ์œ  ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ฆ‰, API ์‚ฌ์šฉ์ž๋Š” ํŠธ๋ ˆ์ด ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ๊ณ ์ • ๊ฐ€๋Šฅํ•œ ์ƒ์„ฑ์ž์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ๊ธฐ๋Šฅ์„ ์žƒ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ? ํŠน์„ฑ์— ๋Œ€ํ•œ ๋™๊ธฐ๋Š” ๋ถˆ์ถฉ๋ถ„ ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. _ [๊ทธ๋“ค์€] ๊ฒฐ๊ตญ ๊ฐ™์€ ๋ชจ์–‘์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค .'_

  • RustMeUp (myself)๋Š” Own ํŠน์„ฑ์—์„œ own ๋ฉ”์„œ๋“œ์˜ ๋ชฉ์ ์ด ๋ฌด์—‡์ธ์ง€ ๋ฌป์Šต๋‹ˆ๋‹ค. ์™œ ์˜ตํŠธ ์ธํ•˜๋ ค๋Š” ์œ ํ˜•์ด pinned ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ๋‚จ๊ฒจ ๋‘˜ ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ์ด๋ ‡๊ฒŒํ•˜๋ฉด ํŠน์„ฑ์ด ์•ˆ์ „ํ•˜๊ณ  Own ๋ณด๋‹ค ๋œ ์–ด์ƒ‰ํ•˜๊ฒŒ ๋Š๊ปด์ง€๋Š” Pinned ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ด์œ ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์งˆ๋ฌธ์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์™œ๋„ Pin<P> ์ž์ฒด๋„ Pin<P>::new_unchecked ์ œํ•œ P: Deref ?

#[derive(Copy, Clone)]
pub struct Pin<P> {
    pointer: P,
}

impl<P: Deref> Pin<P> { // only change
    pub unsafe fn new_unchecked(pointer: P) -> Pin<P> {
        Pin { pointer }
    }
}

๋˜๋Š”

#[derive(Copy, Clone)]
pub struct Pin<P: Deref> { // changed
    pointer: P,
}

impl<P: Deref> Pin<P> { // changed
    pub unsafe fn new_unchecked(pointer: P) -> Pin<P> {
        Pin { pointer }
    }
}

๋‘˜ ๋‹ค Pin<P> ์—ฌ๊ธฐ์„œ P: !Deref ์ธ์Šคํ„ด์Šค๋Š” ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š” ํ•œ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ...

์—ฌ๊ธฐ ๋‚ด ์š”์ ๊ณผ ryani ์˜ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ryani๋Š” Deref๋ฅผ ์ œํ•œํ•˜๋Š” ๊ตฌํ˜„์ด ์™œ์ถ”๊ฐ€ ์ผ๋ฐ˜ T๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? P :: Target ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

์ด ๋‘ impls๋Š” ์ž‘์„ฑ ๋ฐฉ๋ฒ• ์™ธ์—๋Š” ์ „ํ˜€ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

ํ•€์ด์—†๋Š” ์ด์œ 

์ž์ฒด๋„ ํ•€

:: new_unchecked P๋กœ ์ œํ•œ๋จ : Deref?

๋‚˜๋Š” ์˜๊ฒฌ์ด ์—†์Šต๋‹ˆ๋‹ค. ์—ญ์‚ฌ์ ์œผ๋กœ std ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ตฌ์กฐ์ฒด์— ๋ฌถ์—ฌ ์žˆ์ง€ ์•Š์•˜์ง€๋งŒ ๊ทธ ์ •์ฑ…์ด ๋™๊ธฐ๊ฐ€ ์ข‹์€ ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์—ญ์‚ฌ์ ์ธ ์‚ฌ๊ณ ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


# 53227์ด ์ฐฉ๋ฅ™ ํ•œ ํ›„์ด๋ฅผ ๊ตฌํ˜„ํ•  ๊ณ„ํš์ด์ง€๋งŒ ๋…ผ๋ž€์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— Own ํŠน์„ฑ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ Box , Rc ๋ฐ Arc ์˜ pinned ๊ณ ์œ  ์ƒ์„ฑ์ž Arc ์žˆ์Šต๋‹ˆ๋‹ค.

@ arielb1์ด ์ž‘์„ฑํ•œ ๋‚ด์šฉ์— ๋”ฐ๋ผ, ์ €๋Š” ์—ฌ๊ธฐ์„œ Pin ์„ ์‹ค์ œ๋กœ "ํฌ์ธํ„ฐ ์œ ํ˜• ์ƒ์„ฑ์ž"์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ด…๋‹ˆ๋‹ค. Box ๋˜๋Š” &'a mut ์™€ ๊ฐ™์€ "์ข…๋ฅ˜" * -> * ๋ฌผ๋ก , ์šฐ๋ฆฌ๋Š” ์‹ค์ œ๋กœ ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ๊ตฌ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋ถˆ๋ณ€์„ฑ ์ธก๋ฉด์—์„œ ์ด๊ฒƒ์„ ์ดํ•ดํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ 4 ๊ฐœ (์•ˆ์ „์„ฑ ( ๋‚ด ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ์—์„œ์™€ ๊ฐ™์ด ์œ ํ˜•๋ณ„ ๋ถˆ๋ณ€ : ์†Œ์œ , ๊ณต์œ , ๊ณ ์ • ์†Œ์œ , ๊ณ ์ • ๊ณต์œ .

Pin<Ptr><T> ๋Š” T ์˜ ๋ถˆ๋ณ€์„ ๊ฐ€์ ธ ์™€์„œ ๋ณ€ํ˜• (๋ชจ๋“  ๊ณณ์—์„œ ๊ณ ์ • ๋œ ๋ถˆ๋ณ€ ์‚ฌ์šฉ) ํ•œ ๋‹ค์Œ Ptr ์„ ์ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•œ ํ˜•์‹ํ™”์—๋Š”์ด ๋ทฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค Ptr ์ƒ์„ฑ์ž๋ฅผ ํ•ด๋‹น ๊ฒฐ๊ณผ ์œ ํ˜•์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ Owned ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•ด์•ผํ•˜์ง€๋งŒ ์–ด์จŒ๋“  ์žฅ๊ธฐ์ ์œผ๋กœ ๊ณ„ํš ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.) ํ˜•์‹์ฃผ์˜ ์ธก๋ฉด์—์„œ๋Š” Ptr<Pin<T>> ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜์ง€๋งŒ ์‹œ๋„ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ Rust์™€ ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํฌ์ธํ„ฐ ์œ ํ˜• ์ƒ์„ฑ์ž๊ฐ€ Pin "์˜ตํŠธ ์ธ"ํ•  ๋•Œ ๋งŒ๋“œ๋Š” ์•ฝ์†์€ Deref / DerefMut ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅ์ด ์‹ค์ œ๋กœ Ptr ์œ ํ˜•์˜ ๊ณ ์ • ์†Œ์œ  / ๊ณต์œ  ๋ณ€ํ˜•์— ์ ์šฉ๋˜๋ฉด ์ถœ๋ ฅ์€ ํ•ด๋‹น ์œ ํ˜•์˜ ๊ณ ์ • ์†Œ์œ  / ๊ณต์œ  ๋ณ€ํ˜•์„ ์ถฉ์กฑํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ๋“ค์€ ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์—์„œ ์œ ์ผํ•œ ๋‘ ๊ฐ€์ง€ "์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐฉ๋ฒ•"์ž…๋‹ˆ๋‹ค (๋ถˆ๋ณ€์„ฑ์— ๋Œ€ํ•ด์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ) :

impl<P, T> Pin<P> where
    P: Deref<Target = T>,
{
    pub fn as_ref(this: &Pin<P>) -> Pin<&T> {
        Pin { pointer: &*this.pointer }
    }
}

impl<P, T> Pin<P> where
    P: DerefMut<Target = T>,
{
    pub fn as_mut(this: &mut Pin<P>) -> Pin<&mut T> {
        Pin { pointer: &mut *this.pointer }
}

์‚ฌ์šฉํ•˜๊ธฐ์— ์•ˆ์ „ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์€ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Pin<&T> -> &T ๋Š” ์•ˆ์ „ํ•œ ๋ณ€ํ™˜์ด๋ฉฐ Unpin ์œ ํ˜•์˜ ๊ฒฝ์šฐ Pin<&mut T> -> &mut T ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. .

์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋‚ด๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๊ฒƒ Deref ๋ฐ DerefMut ์— ๋Œ€ํ•œ ๊ตฌํ˜„ Pin ๊ฐ™์€ ๊ฒƒ์œผ๋กœ

impl<'a, T: Unpin> Pin<&'a mut T> {
    pub fn unpin_mut(this: Pin<&'a mut T>) -> &'a mut T {
        this.pointer
    }
}

impl<'a, T> Pin<&'a T> {
    // You cannot move out of a shared reference, so "unpinning" this
    // is always safe.
    pub fn unpin_shr(this: Pin<&'a T>) -> &'a T {
        this.pointer
    }
}

// The rest is now safe code that could be written by users as well
impl<P, T> Deref for Pin<P> where
    P: Deref<Target = T>,
{
    type Target = T;
    fn deref(&self) -> &T {
        Pin::unpin_shr(Pin::as_ref(self))
    }
}

impl<P, T> DerefMut for Pin<P> where
    P: DerefMut<Target = T>,
    T: Unpin,
{
    fn deref_mut(&mut self) -> &mut T {
        Pin::unpin_mut(Pin::as_mut(self))
    }
}

์ด ๋‘ ์‚ฌ๋žŒ ์€ ์ƒˆ๋กœ์šด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์„ ๊ฐ€์ •ํ•˜๊ณ  as_ref / as_mut ๋ฅผ Pin<&[mut] T> ์—์„œ &[mut] T ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. - as_ref / as_mut ๋Š” ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ์œ ํ˜• ์ƒ์„ฑ์ž๊ฐ€ ๊ฑฑ์ •ํ•ด์•ผ ํ•  ์œ ์ผํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.


ํ˜„์žฌ PinMut ๊ฐ€์žˆ๋Š” borrow ๋ณต์šฉ ๋ฐฉ๋ฒ• &mut self ์‰ฝ๊ฒŒ ์—ญ ์ฐจ์šฉ์— ๋Œ€ํ•œ (์ด ๊ฑธ๋ฆฌ๋ฏ€ self , ์šฐ๋ฆฌ๋Š” ์ž๋™ ๋Œ€์ถœ์„๋ฐ›์„). ์ด ๋ฉ”์„œ๋“œ๋Š” Pin::as_mut ์™€ ์ •ํ™•ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋„ ์ด๋Ÿฐ ๊ฑธ ์›ํ• ๊นŒ์š”?

์Šฌ๋ผ์ด์Šค์—๋Š” get_unchecked_mut ์ด ์žˆ์ง€๋งŒ ํ•€์—๋Š” get_mut_unchecked ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๊ด€๋œ ๊ฒƒ์„ ๊ณ ์ˆ˜ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ?

๋ˆ„๊ตฐ๊ฐ€ rfcbot์˜ ์šฐ๋ ค์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@rfcbot ๊ด€์‹ฌ์‚ฌ get_mut_unchecked_mut_mut

๋ฐฉ๊ธˆ Rustc๊ฐ€ ๋ฌผ๊ฑด์„ ๋ณต์‚ฌํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ์ƒํ™ฉ์„ ์žŠ์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ์ง€๊ธˆ์€ ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํŒจํ‚น ๋œ ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚น ๋œ ๊ตฌ์กฐ์ฒด์— ์‚ญ์ œ๊ฐ€ ํ•„์š”ํ•œ ํ•„๋“œ๊ฐ€์žˆ๋Š” ๊ฒฝ์šฐ rustc๋Š” ํ•ด๋‹น ํ•„๋“œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌ ๋œ ์–ด๋”˜๊ฐ€์— ๋ณต์‚ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋‚ด ๋ณด๋‚ธ ๋‹ค์Œ drop ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” &mut ์ „๋‹ฌ ๋œ drop ๊ฐ€ ์‹ค์ œ๋กœ ์ •๋ ฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์—๊ฒŒ ์ด๊ฒƒ์€ repr(packed) ๊ตฌ์กฐ์ฒด๊ฐ€ "๊ตฌ์กฐ์ "๋˜๋Š” "์žฌ๊ท€ ์ "wrt๊ฐ€ ์•„๋‹ˆ์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ณ ์ •-๊ตฌ์กฐ์ฒด ์ž์ฒด๊ฐ€ ๊ณ ์ • ๋œ ๊ฒฝ์šฐ์—๋„ ํ•„๋“œ๊ฐ€ ๊ณ ์ • ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๊ทธ๋Ÿฌํ•œ ๊ตฌ์กฐ์ฒด์—์„œ pin-accessor-macro๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์„œ์— ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋ชจ๋“  ๊ณ ์ • ๋ฌธ์„œ ์œ„์— ๋ง์น ํ•ด์•ผํ•˜๋Š” ๊ฑฐ๋Œ€ํ•œ ํ’‹๊ฑด์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

@alercah ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด Unpin ๋˜๋Š” Drop ๋‹จ์ˆœํ™”ํ•˜๋Š” ๊ธฐ์กด์˜ ๋Šฅ๋ ฅ๋ณด๋‹ค ํ’‹๊ฑด์— ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค-ํ™•์‹คํžˆ ๋‘˜ ๋‹ค #[repr(packed)] ๋ณด๋‹ค ๊ณ ์ • ๋œ ๊ฐ’๊ณผ ํ•จ๊ป˜ ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค

๊ณต์ • ํ•ด. ๋‚ด ์šฐ๋ ค๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํ”„๋กœ์ ์…˜์ด ์ž‘์„ฑํ•˜์ง€ ์•Š์€ ์œ ํ˜•์— ๋Œ€ํ•ด ์•ˆ์ „ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  packed ๊ฐ€ ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‚ฌ๋žŒ์ด์ด๋ฅผ์ธ์ง€ ํ•  ์ฑ…์ž„์ด์žˆ๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ด์ง€๋งŒ ๊ทธ๋Ÿฌํ•œ ํ”„๋กœ์ ์…˜์ด ๋ฐœ์ƒํ•  ์ˆ˜์žˆ๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์ถ”๊ฐ€๋กœ ๋ฌธ์„œํ™”ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ , ์ด๊ฒƒ์€ ๊ณ ์ •์ด ์žฌ๊ท€ ์ ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•„๋“œ ์œ ํ˜•์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ํŒจํ‚น ๋œ ๊ตฌ์กฐ์ฒด๊ฐ€ Unpin ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ• ๊นŒ์š”?

@alercah ๊ฝ‰ ์ฐฌ ํ˜•ํƒœ๋ฅผ ํ†ตํ•ด ํ•€์— ๊ทธ๋ƒฅ, ๋‚˜๋Š” ํฌ์žฅ ์œ ํ˜•์ด ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜๋Š”์ง€ ์Šˆํผ ์ต์ˆ™ํ•˜์ง€ ์•Š์€,ํ•˜์ง€๋งŒ ๋‚œ์ด ํฌ์žฅ ๋œ ํ˜•ํƒœ๋กœ ํ•€์˜ ์•ˆ์ „์„ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํŒจํ‚น ๋œ ์œ ํ˜•์„ ์ œ์–ดํ•˜์ง€ ์•Š๋Š” ์œ ์ผํ•œ ๊ฒฝ์šฐ๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ ์œ ํ˜•์˜ ๊ณต๊ฐœ ํ•„๋“œ ์— ํ”„๋กœ์ ์…˜ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋ฉฐ, ์ด๋Š” Drop ๋˜๋Š” ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ธํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ๊ฐ€ ์•ˆ์ „ํ•จ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํ•€ ํ”„๋กœ์ ์…˜์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํ•œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ•„๋“œ์— ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์€ ์ž˜๋ชป๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ , ์ด๊ฒƒ์€ ๊ณ ์ •์ด ์žฌ๊ท€ ์ ์ด ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•„๋“œ ์œ ํ˜•์— ๊ด€๊ณ„์—†์ด ๋ชจ๋“  ํŒจํ‚น ๋œ ๊ตฌ์กฐ์ฒด๊ฐ€ ๊ณ ์ • ํ•ด์ œ ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ์ƒ์ƒํ•  ์ˆ˜์žˆ๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์ „์ฒด ๊ตฌ์กฐ์ฒด์˜ ์ฃผ์†Œ์—๋งŒ ๊ด€์‹ฌ์ด ์žˆ์ง€๋งŒ ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์ฃผ์†Œ๋ฅผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ํ•จ๊ป˜ ์Šค์ฟผ์‹œํ•˜๋ ค๋Š” ์ž˜๋ชป ์ •๋ ฌ ๋œ ๋ฐ์ดํ„ฐ๊ฐ€์žˆ๋Š” ์นจ์ž… ํ˜• ์—ฐ๊ฒฐ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

Futures์™€์˜ ์ž‘์—…์œผ๋กœ ์ธํ•ด Pin API๋ฅผ ๋ฐฐ์›Œ์•ผํ–ˆ๋Š”๋ฐ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Box ๋Š” Unpin ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • Box ๋Š” DerefMut ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • Pin::get_mut ๋ฉ”์„œ๋“œ๋Š” ํ•ญ์ƒ &mut Box<T> ( Box ๋ฌด์กฐ๊ฑด Unpin ๊ตฌํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค).

์ข…ํ•ฉ ํ•˜๋ฉด ์™„์ „ํžˆ ์•ˆ์ „ํ•œ ์ฝ”๋“œ๋กœ ๊ณ ์ • ๋œ ๊ฐ’์„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

์ด๊ฒƒ์€ ์˜๋„ ๋œ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์ด๊ฒƒ์ด ์•ˆ์ „ํ•œ ์ด์œ ์— ๋Œ€ํ•œ ๊ทผ๊ฑฐ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Pin<&mut Box<...>> ์ด์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Box ์€ (๋Š”) Box ๋‚ด๋ถ€ ํ•ญ๋ชฉ์ด ์•„๋‹ˆ๋ผ Box ๋Š” ์Šคํƒ์— ํ•ด๋‹น ์œ„์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ Box ๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

์›ํ•˜๋Š” ๊ฒƒ์€ Pin<Box<...>> ์ž…๋‹ˆ๋‹ค. ๋†€์ดํ„ฐ ๋งํฌ .

ํŽธ์ง‘ : ๋” ์ด์ƒ ์ •ํ™•ํ•˜์ง€ ์•Š์Œ

@Pauan Box ๊ฐ€ ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค๊ณ ํ•ด์„œ _inside_๊ฐ€ ๊ณ ์ • ๋œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์ฐพ๊ณ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ PinBox ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹น์‹ ์ด ์–ธ๊ธ‰ ํ•œ ๋™์ž‘์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ PinMut<Foo> ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@tikue Pin<Box<...>> ์—์„œ ๋ฒ—์–ด๋‚˜๋Š” ๊ฒƒ์ด ์—ฌ์ „ํžˆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@tmandry ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ • ํ•ด ์ฃผ์ง€๋งŒ Pin<Box<...>> ์€ ์ƒ์ž ์ž์ฒด๊ฐ€ ์•„๋‹Œ Box ์•ˆ์— ๋ฌผ๊ฑด์„ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. @Pauan ์˜ ์›๋ž˜ ์˜ˆ์—์„œ Pin<&mut Box<...>> ๋Š” Box ๋งŒ ๊ณ ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. Pin<Box<...>> ๊ฐ€ ์ƒ์ž ์•ˆ์˜ ์‚ฌ๋ฌผ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ๋ฅผ ์–ป๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‚ด ๋†€์ดํ„ฐ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

PinBox ๊ฐ€ ์ตœ๊ทผ์— ์ œ๊ฑฐ๋˜์—ˆ์œผ๋ฉฐ Pin<Box<T>> ์ด์ œ PinBox ์™€ ๋™์ผํ•œ ์˜๋ฏธ๋ฅผ๊ฐ€์ง‘๋‹ˆ๋‹ค.

@tmandry PinBox<T> ๊ฐ€ ์ œ๊ฑฐ๋˜๊ณ  Nightly์—์„œ Pin<Box<T>> ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค (์ œ๊ณต ํ•œ ๋ฌธ์„œ ๋งํฌ๋Š” Stable ์šฉ์ž…๋‹ˆ๋‹ค). ๋‹ค์Œ ์€ ์˜ฌ๋ฐ”๋ฅธ Nightly ๋งํฌ์ž…๋‹ˆ๋‹ค.

์•„, ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉํ•œ ์ดํ›„๋กœ ๊ทœ์น™์ด ๋ฐ”๋€Œ์—ˆ๋‚˜ ๋ด์š”. ํ˜ผ๋ž€์„ ๋“œ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

@tmandry ์˜ˆ, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋งค์šฐ ์ตœ๊ทผ์ž…๋‹ˆ๋‹ค. ์ƒํ™ฉ์ด ์—ฌ์ „ํžˆ ์œ ๋™์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ณ€ํ™”๋ฅผ ๋”ฐ๋ผ ๊ฐ€๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@tikue ์˜ ์˜๊ฒฌ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ํ•€์€ ํ•œ ์ˆ˜์ค€์˜ ๊ฐ„์ ‘ ๋ฐฉํ–ฅ ๋งŒ ๊ณ ์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@tikue @tmandry @withoutboats ๋‹ต๋ณ€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋งค์šฐ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ๋‘ ๊ฐ€์ง€ ์šฐ๋ ค์˜ ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ( api-refactor & get_mut_unchecked_mut_mut ) async / await ์‹œ๋ฆฌ์ฆˆ ๊ธฐ๋Šฅ์„ ๊ฐ„์ ˆํžˆ ๊ธฐ๋‹ค๋ฆฌ๊ณ ์žˆ๋Š” ์‚ฌ๋žŒ์œผ๋กœ์„œ Pin API๊ฐ€ ์–ด๋–ค rustc ๋ฒ„์ „์„ ๋Œ€์ƒ์œผ๋กœํ• ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ฒฌ์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ crlf0710 ์•ˆ์ •ํ™” ์ œ์•ˆ์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

@withoutboats ๋๋‚ฌ์–ด? ๋‹ซ์„๊นŒ์š”?

์ข‹์•„์š”, ์—ฌ๊ธฐ๊ฐ€์ด ๊ธ€์„ ์˜ฌ๋ฆด ๊ณณ์ด ์•„๋‹ˆ๋ผ๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ Drop + !Unpin ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์•„์ด๋””์–ด๊ฐ€ ๋‚˜์™”์Šต๋‹ˆ๋‹ค.

  1. ์ด์ƒ์ ์œผ๋กœ Drop::drop ์ด fn(self: Pin<&mut Self>) ์ด๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. Drop PinDrop ๋ผ๊ณ  ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์†Œ๊ธ‰ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋กœ ์ธํ•ด Drop ์„ PinDrop ๋Œ€์ฒด ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  1. Drop::drop(&mut self) ์˜ ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” Drop + !Unpin ์ผ€์ด์Šค์— ๋Œ€ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ Drop + Unpin ๋Œ€ํ•ด PinDrop ์˜ ๊ธฐ๋ณธ impl์„ ํŒŒ์ƒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ดํ›„ Pin<&mut T> : DerefMut<Target = T> ) ๋ฐํ•˜๊ธฐ PinDrop ์ž๋™์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŠน์„ฑ ์ˆ˜ rustc ์— (๊ฐ์‚ฌ Pin::new_unchecked(&mut self) ๋“œ๋กญ ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ๋•Œ) ๊ณ ์ • ์Šคํƒ์˜ ๊ฒฝ์šฐ์—๋งŒ์ด๊ธฐ ๋•Œ๋ฌธ์—.

๋‹ค์Œ์€ ์•„์ด๋””์–ด์˜ ๋Œ€๋žต์ ์ธ PoC์ž…๋‹ˆ๋‹ค. https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=9aae40afe732babeafef9dab3d7525a8

์–ด์จŒ๋“ , imho ์ด๊ฒƒ์€ beta ๋‚จ์•„ ์žˆ์–ด์•ผํ•˜๋ฉฐ ์˜ˆ์™ธ ์ผ์ง€๋ผ๋„ ์•„์ง ์•ˆ์ •๋˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค. Drop ๋™์ž‘์ด compat์„ ๊นจ์ง€ ์•Š๊ณ  Unpin ์— ์˜์กด ํ•  ์ˆ˜์žˆ๋Š” ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ๊ทธ ์‹œ๊ฐ„์€ ์ง€๊ธˆ์ž…๋‹ˆ๋‹ค.

@danielhenrymantilla impl<T> Drop for Vec<T> ์™€ ๊ฐ™์€ ๊ธฐ์กด ์ผ๋ฐ˜ ๋“œ๋กญ impls์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
Sized ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ?Unpin ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ตํŠธ ์•„์›ƒ์œผ๋กœ ๋ชจ๋“  ์ œ๋„ค๋ฆญ์— ๋ฐ”์ธ๋”ฉ ๋œ ์•”์‹œ ์  T: Unpin Sized

๊ทธ๊ฒƒ์€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค

impl<T> Drop for Vec<T>
where
  T : Unpin, // implicit, which implies that Vec<T> : Unpin which "upgrades" `Drop` into `PinDrop`

Sized ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ?Unpin ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ตํŠธ ์•„์›ƒ์œผ๋กœ ๋ชจ๋“  ์ œ๋„ค๋ฆญ์— ๋ฐ”์ธ๋”ฉ ๋œ ์•”์‹œ ์  T: Unpin Sized

์ด๋Š” ์ „์ฒด API ๋””์ž์ธ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉฐ ?Move ์ œ์•ˆ์˜ ์ผ๋ถ€๋กœ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋…ผ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ณ ์ • ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŽ์ด ์—…๋ฐ์ดํŠธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์€ ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ ์–ป์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ „์šฉ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ด๊ฒƒ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚ซ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ๋ชจ๋“  ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ !Unpin ํ˜ธํ™˜๋˜๋„๋ก ์—…๋ฐ์ดํŠธํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ๊ธฐ์ ์œผ๋กœ ๋ง‰๋Œ€ํ•œ ๋น„์šฉ์ด ๋“ค์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” "์•ˆ์ „ํ•œ" Drop ๋๋‚ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์šฐ๋ฆฌ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์—๋Š” ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜๊ฒŒ ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๊ณต์ •ํ•œ ์šฐ๋ ค์ž…๋‹ˆ๋‹ค (์ด์ „์— ์ œ๊ธฐ ๋œ ์‚ฌ์‹ค์€ ๋ชฐ๋ž์Šต๋‹ˆ๋‹ค. ์ง€์  ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, @RalfJung ). ๋‹จ๊ธฐ์ ์ธ ์‹ค์งˆ์ ์ธ ๋‹จ์ ์ด drop(Pin<&mut Self>) ์˜ ์ž‘์€ ์•ˆ์ „ ์ด๋“๋ณด๋‹ค ๋” ํฐ ๋น„์ค‘์„ ์ฐจ์ง€ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

์ฃผ์†Œ์—์„œ Pin ์œ ํ˜• ํ•ด์‹ฑ์— ๋Œ€ํ•œ Hash ๊ตฌํ˜„์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๊นŒ?

Pin ์—๋Š” ํฌํ•จ ๋œ ํฌ์ธํ„ฐ์— ๋‹จ์ˆœํžˆ ์œ„์ž„ํ•˜๋Š” Hash ๊ตฌํ˜„์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์‹œ๋ฉ๋‹ˆ๋‹ค).

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰