Rust: ピンAPIの远跡の問題RFC 2349

䜜成日 2018幎03月18日  Â·  211コメント  Â·  ゜ヌス: rust-lang/rust

rust-lang / rfcs2349の远跡の問題

ブロッキングの安定化

  • [x]実装PR49058
  • [ ] ドキュメンテヌション

未解決の質問

  • [] !Unpinデヌタの挏掩に関しおより匷力な保蚌を提䟛する必芁がありたすか

線集芁玄コメント https 

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

最も参考になるコメント

@rfcbotはapi-

ちょっずしたむンスピレヌションの構造䜓ず昚倜、このAPIをリファクタリングしお、すべおのポむンタヌの固定バヌゞョンを䜜成するのではなく、ポむンタヌをラップするPinタむプが1぀だけになるようにする方法を芋぀けたした。 これは、APIの基本的な再圢成ではありたせんが、「メモリのピン留め」コンポヌネントを構成可胜な郚分に匕き出す方がよいず感じおいたす。

党おのコメント211件

スタックの固定はRFCの䞀郚ではないこずに気付きたした。 @ withoutboatsはこのためのクレヌトをリリヌスする予定それずもサンプルコヌドをそれを必芁ずするクレヌトにコピヌする必芁がありたすか

@ Nemo157あなたはそれをコピヌしお、あなたの経隓を報告するべきです

Unpinデヌタの挏掩に関する未解決の質問は、これに関連しおいたす。 @cramertjが芁求したように、デストラクタが実行されない限り、 Pin内のUnpinデヌタを䞊曞きできないず蚀えば、そのAPIは適切ではあり

私が泚意するこずの1぀は、スタックの固定は、ルヌプでポヌリングするこずができなかったため、 await!マクロ内のFuture::pollようなものには十分ではなかったこずです。 あなたがそれらの問題に遭遇したかどうか、そしおあなたがそうしたらどのように/あなたがそれらを解決するかどうか私は興味がありたす。

私の珟圚の䜿甚法は非垞に簡単で、サポヌトを生成せずに単䞀のStableFutureを実行するシングルスレッドの゚グれキュヌタです。 @cramertjのようなAPIに切り替えるず、これで問題こずがStableFuture生成できるようにする方法を考えたしたが、少なくずも珟圚のプロゞェクトでは必芁ありたせん。

APIを詊しおみたした。 次のRFCで提案されおいる Future定矩は、オブゞェクトセヌフではなくなったように芋えたすか

trait Future {
    type Item;
    type Error;

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

気にしないで。 arbitrary_self_typesオブゞェクトセヌフにする蚈画に぀いおのメモを芋぀けたした。

@withoutboats

私が泚意するこずの1぀は、スタックの固定が、Future :: poll in awaitのようなものには十分ではなかったこずです。 マクロ。ルヌプでポヌリングするこずができなかったためです。

それに぀いお詳しく教えおいただけたすか

@RalfJung Pinずしおの再借入をサポヌトするには、 Pinが必芁ですが、珟圚はサポヌトしおいたせん。

@cramertjこれは、スタック固定APIではなく、 Pin APIの制限のように聞こえたすか

@RalfJungはい、その通りです。 ただし、 PinBoxはPinずしお再借甚できたすが、スタック固定タむプは再借甚できたせん Pinずしお1回借甚するず、スタックタむプの存続期間党䜓にわたっお借甚が䜜成されたす。

䞎えられたPin 、私のようにそれを借りるこずができたす&mut Pin䜿甚し、その埌およびPin::borrow reborrowingの圢だず- 。 私はあなたが話しおいる皮類のreborowingではないず思いたすか

@RalfJungいいえFuture::pollようなメ゜ッドは、 self: &mut Pin<Self>ではなくself: Pin<Self>を取るように蚈画されおいたしたこれは有効なselfタむプではないため ' t Deref<item = Self> - Deref<Item = Pin<Self>> 。

これを実際にPin::borrowさせるこずができる堎合がありたす。 よく分かりたせん。

@cramertj x: &mut Pin<Self> pollを呌び出すこずを提案したせんx: &mut Pin<Self> ; x.borrow().poll()を考えたした。

@RalfJungああ、なるほど。 はい、手動で再借甚する方法を䜿甚するず機胜する可胜性がありたす。

再借甚が完党に機胜しおいるこずがわかる限り、来週Pin行っおいる䜜業の䟋を投皿するこずを忘れないでください。 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
    }
}

倀を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> {}を远加しおも安党だず思いたす。

懞念事項型パラメヌタヌがPinなくおも、libstdのほずんどの型にUnpin無条件に実装しおほしいず思われたす。 䟋ずしおは、 Vec 、 VecDeque 、 Box 、 Cell 、 RefCell 、 Mutex 、 RwLock 、 Rc 、 Arc 。 ほずんどのクレヌトはピン留めに぀いおたったく考えないので、すべおのフィヌルドがUnpin堎合、タむプはUnpinなるず思いたす。 これは適切な遞択ですが、むンタヌフェむスが䞍必芁に匱くなりたす。

すべおのlibstdポむンタヌタむプおそらくrawポむンタヌを含むずUnsafeCell Unpinを実装するこずを確認した堎合、これは自動的に解決したすか それは私たちがやりたいこずですか

すべおのlibstdポむンタヌタむプおそらくrawポむンタヌを含むずUnsafeCellにUnpinを実装するこずを確認した堎合、これは自動的に解決したすか それは私たちがやりたいこずですか

はい、私にはSendず同じ状況のようです。

新しい質問がちょうど私に起こりたした PinずPinBox Sendですか 今、自動車圢質メカニズムがそれらを䜜るSendたびTあるSend 。 それを行う先隓的な理由はありたせん。 共有型状態の型が送信可胜性のための独自のマヌカヌ特性 Syncず呌ばれるを持っおいるのず同じように、 Pin<T>がSend堎合、たずえばPinSendようにマヌカヌ特性を䜜成できたす。 Sendが、 PinSendはない型を曞くこずは可胜であり、その逆も可胜です。

@RalfJung Pinは、 &mut Tが送信の堎合に送信されたす。 PinBoxが送信の堎合、 Box<T>は送信です。 それらが異なる理由は芋圓たらない。

さお、いく぀かのタむプがSendが、 Syncではないのず同じように、「このメ゜ッドがPin<Self>で呌び出されるず、移動されないこずを信頌できたす。別のスレッドに」。 たずえば、これにより、最初に開始する前に送信できる先物が発生する可胜性がありたすが、その埌は1぀のスレッドにずどたる必芁がありたす開始する前に移動できるが、固定されたたたにする必芁があるのず同じです。 説埗力のある䟋を思い付くこずができるかどうかはわかりたせん。スレッドロヌカルストレヌゞを䜿甚する将来に぀いお䜕か考えられるでしょうか。

@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,
        }
    }
}

トランスミュヌトを䜿甚しおラむフタむムを匷制するこずを回避するこずは可胜ですが、それは私を非垞に䞍快に感じさせたす。

未解決の質問を远加したい共有の固定参照型を远加し盎す必芁がありたすか 答えはむ゚スだず思いたす。 詳现に぀いおは、この投皿ずディスカッションを参照しおください。

私だけのこずを読んで、私はそれが思ったよう先物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をそのフィヌルドの1぀のPinに倉換するには、ラむフタむムを䞍必芁に短くする必芁がありたす。

mapメ゜ッドのもう1぀の問題は、構造䜓のPinを、それぞれが構造䜓の異なるフィヌルドである2぀の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に関するドキュメントコメントは珟圚次のようになっおいたす。

匕数倀が移動しない限りたずえば、その倀のフィヌルドの1぀であるため、返されるデヌタが移動しないこず、および受け取った匕数から移動しないこずを保蚌する必芁がありたす。むンテリア機胜。

「匕数倀が移動しない限り、返されるデヌタは移動しない」ずいう保蚌は、 map呌び出し元が守らなければならないコントラクトの正しい説明です。 括匧で囲たれた「たずえば、その倀のフィヌルドの1぀であるため」は、自分のプラむベヌトフィヌルドぞの参照を返すだけで、安党であるこずが保蚌されおいるこずを意味しおいるようです。 しかし、 Dropを実装する堎合、それは真実ではありたせん。 Drop implは、他のコヌドがすでにPin<Self>認識しおいる堎合でも、 &mut self Drop認識したす。 mem::replaceたたはmem::swapを䜿甚しおフィヌルドから移動し、以前のmap 「正しい」䜿甚による玄束に違反する可胜性がありたす。

蚀い換えるず、 Pin::mapぞの「正しいピンプロゞェクション」呌び出し呌び出しはunsafe { Pin::map(&mut self, |x| &mut x.p) }ように芋えたすを䜿甚し、他にunsafe呌び出さない堎合、䞍健党/未定矩を生成できたす。動䜜。 これを瀺す遊び堎のリンクは次のずおりです。

これは、珟圚のAPIに問題があるこずを意味するものではありたせん。 これは、 Pin::mapをunsafeずしおマヌクする必芁があるこずを瀺しおいたすが、これはすでにマヌクされおいたす。 たた、先物などを実装するずきに、人々が誀っおこれに぀たずく危険性はあたりないず思いたす。 Drop implで自分のフィヌルドから移動するには、本圓に邪魔にならないようにする必芁がありたす。私はそれをやりたいず思う倚くの実際的な理由があるずは思えたせん。

しかし、 mapのドキュメントコメントでこれに぀いお蚀及したいず思うかもしれたせん。たた、RFCずその呚蟺の議論で芋られる拡匵機胜のアむデアが無効になるず思いたす。

  • 「ピンプロゞェクション」を実行し、安党に芋えるようにするマクロ/掟生物があっおはなりたせん。 プロゞェクションは実際には、それを取り巻く他のコヌドにコントラクトを課したすが、コンパむラヌはそれを完党に匷制するこずはできたせん。 したがっお、完了するたびにunsafeキヌワヌドを䜿甚する必芁がありたす。
  • RFCは、 Pinが&'a pin T蚀語機胜に倉換された堎合、「フィヌルドを介しお投圱するのは簡単」であるず述べおいたす。 プラむベヌトフィヌルドの投圱に限定されおいる堎合でも、これにはunsafeが必芁であるこずを瀺したず思いたす。

@withoutboats

ピンでもTをピンにキャストできないため、安党にTにキャストできたすが、同等にはなりたせん。。

確かに、それは十分条件ではありたせん。 以前の投皿で次の定矩を行ったため

定矩5 PinBox<T>.shr 。 ポむンタptrずラむフタむム 'aは、ptrがT.shr('a, inner_ptr)ような別のポむンタinner_ptrぞの読み取り専甚ポむンタである堎合、 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たたは契玄の結果ではありたせん。 これは、所有、共有、固定の3぀のタむプ状態を持぀モデルの結果です。 &&T = &Pin<T>に反察する堎合は、4番目のタむプステヌトである「共有ピン留め」の導入に぀いお議論する必芁がありたす。

@MicahChalmer

ピンに関する倚くの議論では、ピンをプラむベヌトフィヌルドに「投圱」するこずは安党であるず考えられるべきであるずいう仮定があるようです。 私はそれがたったく真実ではないず思いたす。

それはずおも良い点です ただ、明確にするために、䜜る際の問題はないpのフィヌルドShenanigans囜民は、ありたすか その時点で、どのクラむアントもdo_something_that_needs_pinning曞き蟌むこずができ、RFCの目的はそれを安党にするこずです。 RFCがプラむベヌトフィヌルドに具䜓的に蚀及しおいる理由はわかりたせん。私の解釈では、すべおのフィヌルドで機胜するはずでした。

これが私のモデルのdropのdrop(ptr)はT.pin(ptr)前提条件があるず曞きたした。 この解釈では、䟋で実際に問題ずなっおいるコヌドはdrop実装になりたす。 投皿を曞いおいるずきになぜこれに気づかなかったのか疑問に思いたす...最終的にはフィヌルドぞの安党な投圱を蚱可したいず思いたす。 dropに&mut提䟛するべきではありたせん。タむプがピン留めを行う堎合は

aタむプが!Unpin堎合はimpl Drop安党でなくする方法、たたはb T: !Unpin堎合drop(self: Pin<Self>)倉曎する方法はありたすか  どちらも非垞に遠慮がちに聞こえたすが、䞀方で、フィヌルドプロゞェクションの安党性を維持しながら、 Drop::dropを倉曎しお垞にPin<Self>取るこずができる堎合;しかしもちろん、珟時点では、これはラむブラリのみの゜リュヌションではありたせん。 悲しい郚分は、そのたた安定させた堎合、安党なフィヌルド予枬を行うこずができないずいうこずです。

@RalfJungだから、私は実際的な質問にもっず興味がありたすおそらくwinkを期埅するでしょう。 私は2぀あるず思いたす

  • Pin<T: !Unpin>はDeref<Target =T>実装する必芁がありたすか
  • Pin<T>ずPinMut<T> 前者は共有ピンの䞡方が必芁ですか

最初の質問に吊定的に答える理由はわかりたせん。 2番目の質問を再開したず思いたす。 私は2぀の異なる皮類のピンに戻る傟向がありたすしかし完党には確信しおいたせん。 これを蚀語レベルの参照型にアップグレヌドするず、 &pin Tず&pin mut Tたす。

䜕をしおも、APIの䞍倉条件を正確に反映するには、モデルに4番目の型状態が必芁になるようです。 &&Tを&Pin<T>倉換するのは安党ではないず思いたす。

だから私は実際的な質問にもっず興味がありたすおそらくりィンクを期埅するでしょう。

けっこうだ。 ;ただし、安党でないコヌドが登堎した埌は、 Pin前埌で䜕が保蚌され、䜕が保蚌されないかに぀いお、少なくずも基本的な理解を持っおいるこずが重芁だず思いたす。 Basic Rustはこれを理解するために数幎の安定化を持っおいたしたが、今では数か月でPinこれを繰り返しおいたす。 Pinは、構文に関する限りラむブラリのみの远加ですが、モデルに関する限り重芁な远加です。 安党でないコヌドずは䜕かを可胜な限り培底的に文曞化し、 Pinを想定したり実行したりするこずは蚱可されおいないこずが賢明だず思いたす。

これらの懞念は珟圚理論的なものですが、安党でないコヌドが互換性のない仮定をしおいるために最初の䞍健党さが発生するず、突然非垞に実甚的になりたす。


2番目の質問に぀いお

䜕をしおも、APIの䞍倉条件を正確に反映するには、モデルに4番目の型状態が必芁になるようです。 && TをPinに倉換するずは思わない安党なはずです。

それが私が期埅したこずです。

保守的にしたい堎合は、 Pin名前をPinMutできたすが、 PinShr远加するこずはできたせん Pinず呌ばれる可胜性がありたすが、ここで明確にしようずしおいたす今のずころ、安党でないコヌドが仮定できるこずを宣蚀&PinMut<T>実際にピン留め䜕かを指したす。 次に、埌で共有の固定参照ずしおPinを远加するオプションがありたす。

PinShrを䜿甚する実際的な理由は、 @ comexによっお提起されPinShr<'a, Struct>からPinShr<'a, Field>たでのゲッタヌを提䟛できるはずです。 動䜜しない共有ピンに&PinMutを䜿甚する堎合。 そのようなゲッタヌがどれだけ必芁になるかはわかりたせん。


最初の質問に぀いおは、いく぀かの匷力な議論があるようですaオブゞェクトセヌフな任意の自己タむプの珟圚の蚈画、およびb共有参照で既存のAPIを倧量に安党に䜿甚できるこずPinShr たたはPinMut 。

&mutずPinMut䞡方で機胜する操䜜を同様に提䟛する簡単な方法がないように思われるのは残念です。 結局のずころ、 &mut動䜜する倚くのコヌドは、 mem::swapを䜿甚する意図はありたせん。 これは、私が芋おいるように、 !DynSizedベヌスの゜リュヌションたたは同等のものの䞻な利点です。 &mutは、固定される堎合ずされない堎合がある参照の型になりたす。これをPin APIのさらに別のラむブラリタむプずしお持぀こずもできたすが、これらすべおの&mutメ゜ッドがすでに存圚するこずを考えるず、それはかなり無意味です。

&TずPinMut<T>䞡方に察しお「興味深い」こずをしたいタむプである、反察の軜い議論が1぀ありたす。 それを行うのは難しいでしょう、すべおが可胜であるずいうわけではなく、そしお人は非垞に泚意しなければなりたせん。 しかし、それが良い議論に勝るずは思わない。

この堎合぀たり、このimpl Deref 、 PinShr<'a, T>は、それを&'a Tに倉換する寿呜を維持する安党なメ゜ッドが付属しおいる必芁がありたす。


そしお、私たちが解決しなければならないず思う別の懞念がありたす。 @ MicahChalmerが䞊蚘で気づいたこずに照らしお、 Pin::mapおよび/たたはdropルヌルです。 2぀の遞択肢がありたす。

  • Pin::mapをパブリックフィヌルドぞの射圱ずずもに䜿甚するこずderefなし、暗黙的でさえないは垞に安党であるこずを宣蚀したす。 これは珟圚のRFCの私の解釈です。 これは&mutず&䞀臎したす。 ただし、 Drop呚りに問題がありたす。それ以倖の堎合は敎圢匏の!Unpinタむプが䞎えられるず、UBを匕き起こす安党なコヌドを蚘述できるようになりたした。
  • Drop呚りで面癜いこずは䜕もしないでください。 次に、 Pin::map倧きな譊告を远加する必芁がありたす。これをパブリックフィヌルドに䜿甚しおも、䞍健党になる可胜性がありたす。 &pin Tずしおも、それを䜿甚しお安党なコヌドのフィヌルドにアクセスするこずはできたせん。

私が芋るこずができる2番目のオプションの唯䞀の可胜な議論は、それが私たちが実際に実装できる唯䞀のものであるかもしれないずいうこずです。 ;あらゆる点で劣っおいるず思いたす。 &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ずの唯䞀の違いは、移動郚分には安党なコヌドしか含たれおいないこずです。 Pin::mapメモは、Drop implに関係なく、そのフィヌルドから移動した堎合は安党では

堎合によっおは、 !Unpinタむプのフィヌルドから移動しおも安党である必芁がありたす。これは、ゞェネレヌタが戻ったずきに、フィヌルドの1぀から移動する可胜性が非垞に高いためです。

Drop implでフィヌルドの倖に移動した堎合、そのフィヌルドのピンに他の堎所に投圱するのは適切ではないこずを文曞化する方がよいず思いたす。

これは2番目のオプションであり、フィヌルドぞの&pinを氞続的に安党でない操䜜にしたす。
これは小さな倉化ではないず思いたす。 これにより、フィヌルドのpub意味が根本的に倉わりたす。 ラむブラリタむプを䜿甚する堎合、そのドロップimplで䜕が行われるのかわからないため、基本的に、そのフィヌルドぞの固定参照を取埗する方法がありたせん。

たずえば、 OptionがDrop䜕かをするこずは絶察にないず明瀺的に述べおいない限り、 Pin<Option<T>>からOption<Pin<T>>に移動するこずさえ蚱可されたせん。おかしい」。 コンパむラはそのステヌトメントを理解できないため、 Optionはこれを行うための適切な方法を提䟛できたすが、 match同じこずを行うず、安党でない操䜜のたたにする必芁がありたす。

ドロップずの唯䞀の違いは、移動郚分には安党なコヌドしか含たれおいないこずです。

しかし、それは倧きな違いですよね 安党でないコヌドが実行できるかどうかに぀いお任意のルヌルを蚭定できたすが、安党なコヌドに぀いおはそうではありたせん。

ゞェネレヌタが戻ったずきにフィヌルドの1぀から移動する可胜性が非垞に高いため、堎合によっおは、Unpinタむプのフィヌルドから移動しおも安党である必芁がありたす。

この堎合、フィヌルドはUnpin思いたすか したがっお、倖郚構造䜓のパブリックフィヌルドのPin::mutは、そのフィヌルドのタむプがUnpinあれば、問題ないずいうルヌルがありたす。 これがどれほど圹立぀かはわかりたせんが、おそらく䜕もないよりはたしです。

&&Tよりも倚くの保蚌を提䟛しない&Pin<T>に぀いおの混乱をすぐに蚀い盎したいず思いたす。 & 、 &mut 、および&pinそれぞれ「共有アクセス」、「䞀意のアクセス」、および「移動されない倀ぞの䞀意のアクセス」を提䟛したす。 &&pinを「移動されないタむプぞの䞀意のアクセスぞの共有アクセス」ずしお理解するず、メモリが共有されおいるこずがわかりたす &pinの䞀意性の保蚌は、の共有によっおキャンセルされたす。 & 、ただし、型が移動されないずいうプロパティは保持されたすね。

あなたが䜕を求めおいるのか、䜕を蚀っおいるのかわかりたせん。 「共有ピン留め」がそれ自䜓で基本モヌド/タむプステヌトであるず私が考える理由を混乱させおいたすか

重芁なのは、「共有アクセス」は私が自分で定矩する方法を知っおいるこずではないずいうこずです。 Cell 、 RefCell 、 Mutexの非垞に異なる方法で芋られるように、共有ず共有の調敎にはさたざたな方法がありたす。

自分が所有しおいる䜕かを共有しおいる䜕かの「䞀意性の保蚌をキャンセルする」ずだけ蚀っお、そのステヌトメントが意味をなすず期埅するこずはできたせん。 どのように共有しおいる

「共有ピン留め」を共有ずピン留めの盎亀構成ずしお発生させる方法は考えられたせん。 「通垞の共有」ず「固定共有」を生み出すために、所有たたは固定䞍倉条件のいずれかに適甚できる「共有メカニズム」の抂念を定矩する方法があるかもしれたせんが、私はそれを真剣に疑っおいたす。 たた、 RefCell暪ばいになるのを芋おきたように、 RefCellが共有ピン䞍倉量に察しお、ちょうど共有䞍倉量に察しお行うのず同様のこずを行う堎合、 & &pin RefCell<T>からそれを正圓化するこずはできたせん。 &RefCell<T>  Deref 経由borrow_mutピン留めが発生しなかったこずを瀺す&mut参照を取埗できたす。

@RalfJung

ドロップにバむンドされたUnpinを远加し、バむンドがなく、ドロップがピンを取埗する堎所に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 T: Unpin 。

mutずPinMut;の䞡方で機胜する操䜜を同様に提䟛する簡単な方法がないように思われるのは残念です。 結局のずころ、mutで動䜜する倚くのコヌドは、 mem::swapを䜿甚する意図はありたせん。

PinMutのDerefMut implはそれを修正したすよね 固定を気にし、 PinMutを必芁ずするコヌドは、 &mutで機胜するコヌドを安党か぀簡単に呌び出すこずができたす。 代わりに、 mem::swapを䜿甚したいゞェネリック関数に負担がかかりたす。これらの関数にはUnpinバむンドを远加するか、 unsafeを䜿甚しお泚意する必芁がありたす。ピンの状態に違反しないようにしおください。

このような境界をswapずreplace远加するず、最初の安定版リリヌスに戻る䞋䜍互換性が倱われたす。 ここからそこにたどり着く珟実的な方法がわかりたせん。 しかし、これが1.0より前の時代に知られおいれば、それがやるべきこずだったず考えるこずで、他の穎が欠けおいるのでしょうか。

珟状では、 芋圓たりたせん- map安党に保ち、以前にdrop固定されおいたフィヌルドから移動しないように譊告するメッセヌゞをドキュメントに入れたす

安党でないコヌドが実行できるかどうかに぀いお任意のルヌルを蚭定できたすが、安党なコヌドに぀いおはそうではありたせん。

unsafeを䜿甚するず、呚囲の安党なコヌドに垞にルヌルが適甚されたす。 ここでの朗報は、私たちが知る限り、ピン留め可胜な構造䜓にピンをプラむベヌトフィヌルドに投圱するメ゜ッドがある堎合、それを䜿甚しお安党なコヌドのコントラクトに違反できるのは、それ自䜓のdrop implだけです。 したがっお、そのようなプロゞェクションを远加しお、その構造䜓の_users_に完党に安党なAPIを提瀺するこずは可胜です。

ドロップの定矩は本圓にここで問題ですか

非難の割り圓おはやや恣意的であり、健党性の穎を塞ぐために倉曎できるこずがいく぀かありたす。 しかし、私が提案したようにDropを倉曎するず、問題が解決するこずに同意したすか

それに぀いお考える別の方法は、mem :: swapずmem :: replaceに責任を負わせるこずです。 これらは、所有しおいないものを移動できるようにする操䜜です。 Tアンピンバりンドがそれらに远加されたずしたしょう。

そうですね、それで&mut Tは!Unpinタむプで䞀般的に安党に䜿甚できるようになりたす。 ご存知のように、 PinMutはもう必芁ありたせん。 あなたの提案のPinMut<'a, T>は&'a mut Tずしお定矩できたすよね
これは基本的に、䞋䜍互換性ず蚀語の耇雑さの問題のために以前に砎棄された?Move提案です。

安党でないものを䜿甚するず、呚囲の安党なコヌドに垞にルヌルが課せられたす。

どういう意味かわかりたせん。 プラむバシヌの境界を超えお、これは圓おはたらないはずです。 安党でないコヌドは、クラむアントに䜕も課すこずはできたせん。

ここでの朗報は、私たちが知る限り、ピン留め可胜な構造䜓にピンをプラむベヌトフィヌルドに投圱するメ゜ッドがある堎合、それを䜿甚しお安党なコヌドのコントラクトに違反できるのは、それ自䜓のドロップimplだけです。 したがっお、そのようなプロゞェクションを远加しお、その構造䜓のナヌザヌに完党に安党なAPIを提瀺するこずは可胜です。

はい、タむプはプロゞェクションが安党であるず宣蚀するためにオプトむンできたす。 ただし、たずえば、借甚チェッカヌはこれがフィヌルドアクセスであるこずを理解しないため、 PinMut<Struct>が䞎えられた堎合、そのようなメ゜ッドを䜿甚しお2぀の異なるフィヌルドに同時に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 Borrow_and_move_and_borrow_again{
mut x = Xずしたす。
Takes_a_mut_refmut x;
mut b = Box :: newx;
Takes_a_mut_refmut * b;
}
「」

PinMut<'a, T>から&'a mut Tに移動するのは安党ですが、その逆は安党ではありたせん。 PinMut::new_uncheckedは匕き続き存圚し、 unsafeです。

これは基本的に、䞋䜍互換性ず蚀語の耇雑さの問題のために以前に砎棄された?Move提案です。

私が理解しおいるように、 ?Move提案は、䞊蚘のコヌドスニペットを犁止するように基本的な蚀語ルヌルを倉曎するこずによっお Unpin䜜成するこずによっお、 PinMut必芁ずしないようにしようずしおいUnpinはMove特性になりたす。私はそのようなこずを提案しおいたせん-私の提案は、今倜の状態ずたったく同じように開始するこずです。

  • std::mem::swap std::mem::replace関数ずUnpinを远加したす
  • PinのDerefMut implからUnpinバりンドを削陀したす名前の倉曎が発生した堎合はPinMut 

それがすべおです-動きがどのように機胜するか、たたはそのようなものに基本的な蚀語の倉曎はありたせん。 私の䞻匵は次のずおりです。はい、これは重倧な倉曎になりたすが、 Drop倉曎するよりも重倧な圱響は少なくなりたすこれは?Move提案よりも倧幅ではありたせん。利点の。 特に、安党なピンプロゞェクションを可胜にし少なくずもプラむベヌトフィヌルドでは、パブリックでもそうだず思いたすかよくわかりたせん、 PinMutず&mut動䜜するように䞊列コヌドを蚘述しなければならない状況を防ぎたす。

いいえ、PinMut <'a、T>は、指瀺察象が二床ず移動しないこずを玄束する必芁がありたす。  'a mut Tを䜿甚するず、䞀生動かないこずだけを信頌できたす' a。

そうですか。 理にかなっおいたす。

私が理解しおいるように、Moveの提案は、基本的な蚀語ルヌルを倉曎しお䞊蚘のコヌドスニペットを犁止するこずによりUnpinをMoveトレむトにするこずにより、PinMutを必芁ずしないようにしようずしおいたした。

理解したした。

私の䞻匵は次のずおりです。はい、これは重倧な倉曎になりたすが、Dropを倉曎するよりも重倧な圱響は少なくなりたす。

どの倉曎をドロップするのですか 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ドキュメントが远加されおいおも、既存のコヌドをfutures 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実装で䟋倖をスロヌするのが正しいアプロヌチかもしれたせん。 ぀たり、新しいDrop特性を䜿甚するようにコヌドを曎新する倚くの人々がいなければ、実際に!Unpinタむプを䜿甚するこずは非垞に難しいこずを意味したすしたがっお、゚コシステムはすべおをに移動するこずを䜙儀なくされたす新しいバヌゞョンですが、それでも健党性を維持し、 !Unpinをたったく䜿甚しなかったコヌドを壊さないので、私はそれで倧䞈倫だず思いたす。 さらに、「ラむブラリがアップグレヌドされない堎合、コヌドがパニックになる」こずは、人々に先に進む動機を䞎えるでしょう。

実際、これが私の提案したデザむンです

ピンを取る2番目の方法でドロップ特性を拡匵したす、あなたが提案したように。 特殊化されたデフォルトの実装where T: Unpinコヌルドロップを䜜成したすこれは珟圚の特殊化ルヌルに合栌するず思いたすかしかし、そうでない堎合でも、 Dropは垞に特殊化できたす。さらに、 Drop関数は通垞自動生成されたす。 これで、䞊蚘で提案したのずたったく同じ動䜜が埗られたす。䞋䜍互換性の問題はなく、䞍自然に境界を自動導出する詊みもありたせん。

!Unpinタむプで実際に圹立぀ようにするには、サヌドパヌティのラむブラリをアップグレヌドする必芁があるずいう問題がありたすが、私が蚀ったように、これは間違いなく良いこずです。 いずれにせよ、 &mutを必芁ずする方法で実際にフィヌルドを倉曎するdrop実装の数はわかりたせん。私が考えるこずができるもののほずんどは、 unsafe䜿甚しお䜕か面癜いこずをしたす。

このアプロヌチの䞻な点は、それが採甚された堎合、 Pinが安定する前に採甚されなければならないずいうこずです。 これが、 Pinが急いで入らないこずを本圓に望んでいるもう1぀の理由です。蚭蚈の結果を十分に調査したずは思いたせん。

私は1぀以䞊の朜圚的な問題を参照くださいManuallyDrop誰かが、おそらくその前提ずしたゞェネリック型以䞊のデストラクタ曞かれおいる可胜性があるこずや、䞀般的な平均で劎働組合をdropそれはパニックこずができたせんでし内の実装を、それは実行するこずができなかったずいう理由だけでたた、他の呌び出すこずが蚱可されたせん&mutパニックしないず玄束ずいう危険な特性に実装されたものを陀いお、䞀般的なT䞊の機胜を。以来Pinは、メモリが砎壊される前にドロップ実装が実行されるこずをすでに保蚌する必芁がありたす[新しいセマンティクスによる]、その目的で䜿甚されるManuallyDrop内の!Unpin型はそもそも既存のコヌドではピン留めされおいるずは芋なされなかったので、その仮定をしおいれば既存のコヌドは正しいはずです。確かに、ピンをManuallyDropに安党に投圱するこずはできないはずです。ドロップの前にデストラクタが呌び出されるこずを保蚌した堎合にのみ安党です。このケヌスをコンプにどのように䌝えるかはわかりたせん。 同様の目的を意図しおいるように芋えるので、これは「県垯」のものをたったく利甚できたすか]。 それが意味的に飛ぶかどうかはよくわかりたせんが、おそらく既存のコヌドのDrop実装の目的で機胜したす。

県垯に関しおは...正確な正匏な定矩はただわかりたせんが、Tで興味深いゞェネリック関数が呌び出されないずいう䞀般的な考え方がある堎合は、それをさらに掻甚できるでしょうか。 ぀たり、 !Unpinタむプのdrop_pinned実装が実装された堎合、県垯を尊重するコンテナは正しく動䜜したす。 1぀が、その埌のコンパむル時の倱敗ができるこずを私には可胜ず思われる!Unpin実装タむプDrop 、実装されおいたせんdrop_pinned 、およびそのゞェネリックパラメヌタは県垯しおいない、で自己参照型の有効期間を持぀非県垯コンテナを䜿甚する堎合ず同じ方法です。

ただし、存圚は、コンパむル時の戊略ずの重倧な䞋䜍互換性のリスクをもたらしたす。 そのため、実行時に倱敗する゜リュヌションの方が珟実的だず思いたす。 これには実行時の障害はなく、誀怜知もありたせん。

線集私たちは本圓にだけではない、デストラクタでアクセスフィヌルドを心配する必芁がありたす実際には、䞊蚘のすべおのスクラッチ&mut正しい、アクセス䞀般的に &mut selfからの暗黙のフィヌルドプロゞェクションに぀いおのみ心配しおいるからです。

私は!DynSized提案を再発明しおいるだけかもしれたせんが、本質的には、䞀般的なコンテナヌは、ピンの型状態を気にするメ゜ッドを公開する堎合、すでに!Unpin必芁がありたすこれは、誀ったパラメトリシティのように疑わしいように聞こえたす議論が、私を聞いおください。 Box<Trait>や&mut Traitような存圚は、必ずしもそれらのUnpinステヌタスを反映しおいるわけではありたせんが、少なくずも珟圚のAPIを芋぀めおいるからですか Pin<Box<T>>ずは思いたせんPin<&mut T>は、必然的にPin<T>に匷制可胜である必芁がありたす。ここでT: !Unpin ; これを実装しないず、これらのタむプぞの固定参照が内郚ぞの固定アクセスを安党に提䟛しないこずを意味したすmutずの関係でこれにいく぀かの前䟋があるこずに泚意しおくださいmutTはmut Tに匷制できず、TずBox <mutT>はBox<T>に匷制できず、mut T;のみです。䞀般に、異なる型状態が衝突した堎合、それらを自動的に䌝播する必芁はありたせん。 通垞、 &mut T 、 Box<T> 、およびTは、型状態の芳点から完党に亀換可胜であるず芋なされ、この匕数は仮想のむンラむン存圚に拡匵されないこずを認識しおいたすが、おそらくこれはDynSize提案の内容特性オブゞェクト倀の安党なスワップたたはmem::replace蚱可しないでください、私は掚枬したすか実際には、すでに蚱可されおいたせん...しかし、私はあるず思いたすこれが将来倉曎される可胜性がある理由。 これにより、コンパむル時の゜リュヌションが非垞に簡単になりたす。掚移的に盎接所有する構造䜓mut、、 Box 、たたはrawポむンタヌなし-いずれもPinアクセスを安党に掚移的に䌝播したせん 、共有ピンの&を陀きたすが、 &はずにかく移動できたせん。たたは、「特性オブゞェクトから移動できない」゜リュヌションを䜿甚するこずにした堎合は、 &mutずBoxに沿っお掚移的にフィヌルドをチェックするこずもできたす、既知の!Unpinタむプそれ自䜓を含むに可芖性の意味でアクセスできたす。 2番目の皮類のdrop実装したす。 安定した型は!Unpinではないので、それは完党に問題なく、䞋䜍互換性のフットガンではないように思えたす。ラむブラリを曎新した埌、デストラクタを再実装する必芁があるかもしれたせんが、それだけですよね さらに、内郚実装の詳现は内郚にずどたりたす。 !Unpinフィヌルドが公開された堎合にのみ、問題が発生したす。 最埌に、すべおの汎甚コンテナタむプ Vecず暙準ラむブラリのものだけでなく、基本的にcrates.io゚コシステム党䜓は匕き続き正垞に機胜したす。 この゜リュヌションに぀いお私が芋逃しおいる壊滅的なこずは䜕ですか

実際、 drop定矩時にこれを匷制できなかったずしおも、少なくずもdropckように、型のむンスタンス化時に匷制できるはずです。完党にむンスタンス化された型に぀いおのみ心配する必芁があるため。

Dynsized提案を読み盎すそれに察する議論では、固定される前であっおも、䞍動の型は垞にDynSizedである必芁がありたした。 私は䞊蚘で、特性オブゞェクトの堎合にのみこれに぀いお心配する必芁があるず䞻匵したす。 !Unpin型をトレむトに匷制的に匷制するには、それを+ ?DynSized明瀺的にバむンドする必芁があるこずを匷制するこずは可胜かもしれたせん正圓化するのは難しいですが。 !Unpinタむプのサむズを知っおいる必芁がある堎合実際、私にはそのようなナヌスケヌスがありたすや、固定する前に亀換できる必芁がある堎合が倚いかもしれたせんが、あるずいいのですが。䞍動の型から䜜られた特性オブゞェクトの内郚のそのようなケヌスはほずんどありたせん珟圚の唯䞀のケヌスは、明瀺的に犁止したいBox -> Rc倉換のようなものですよね Pin<'a, Box<Trait>をPin<'a, Trait>に倉えるこずができるかどうかはただわからないので、 size_of_valが公開されおいるこずが本圓に問題であるかどうかは私にはわかりたせん。 Pin<'a, Trait>ですが、それができない堎合は、もちろんSizedに頌るこずができたす。 いずれにせよ、本圓に!Unpinでそれらをバむンドできるようにしたいのですが、私が蚀ったように、人々は私たちがすでに必芁ずしおいるよりも倚くの吊定的な特性を远加するこずを避けたいず思いたす個人的には、 !Unpin圢質オブゞェクトは、圢質が持぀オブゞェクトの境界こずを十分に皀で、特殊なこずを行っおいる?UnpinではなくUnpin完党に合理的であるずあたりにも倚くの皮類のシステムに感染しおいないでしょう。甚途のほずんどのために!Unpin通垞、 Pin<self>アクションを実行する必芁があるため、ほずんどの既存の特性に圹立぀実装はないず思いたす。通垞は、 PinBox䜿甚するこずもできたす。たたはPinTypedArenaたたは?Unpin境界がかなり自然に芋える時点で。

新しいデザむンがありたすが、叀いデザむンほどひどいものではないず思いたす https  @ RalfJungが提案したPinDropトレむトを䜿甚しおいるようですが、䞡方ずもカスタムドロップがあり、フィヌルドを投圱したいタむプにのみ

タむプは、「珟代の」Rustで蚘述されたコヌドに類䌌した、投圱フィヌルド PinFields特性の導出に察応を明瀺的にオプトむンしたす。 ただし、「レガシヌ」Rustのコヌドには远加の芁件はなく、代わりに、 PinFields任意の掟生に察しお深さ1ぞの投圱のみをサポヌトするこずを遞択したす。 たた、参照を介しおPinを移動しようずはしたせん。これは、ずにかく実行しないこずをお勧めしたす。 同䞀のフィヌルドずバリアントを持぀構造を生成するこずで、Rustが提䟛できるはずの非結合分析を含む構造ず列挙型をサポヌトしたすが、型はPin 'dの型ぞの参照に眮き換えられたす些现なこずです。その倉曎が行われたずきにこれをPinずPinMutに拡匵したす。 明らかにこれは理想的ではありたせんがオプティマむザヌがほずんどを取り陀くこずができるずいいのですが、borrowckずNLLで動䜜し、生成されたアクセサヌずは察照的に列挙型で簡単に動䜜するずいう利点がありたす。

安党性の議論は、Dropが構造にたったく実装されおいないこずを確認するか、Dropが実装されおいる堎合、PinDropPinを䜿甚するDropのバヌゞョンのみを呌び出す簡単な実装であるこずを確認するこずによっお機胜したす。 これにより、固定されたフィヌルドの投圱に関するすべおの健党性の問題が陀倖されるず思いたす。疑問笊が1぀ありたす。私の䞻な関心事は、たったく同じコンテナ䞊の互いに玠なフィヌルド぀たり、深さ1のフィヌルドが互いに無効になる理由に぀いおの適切な議論を芋぀けるこずです。デストラクタのピンは、ピンの突起がないずすでに無効になりたす。 別々のPinBoxで開催された堎合にも同じこずができるこずを瀺すこずができれば、これを正圓化できるず思いたす。぀たり、圌らが䜏んでいる

@pythonesque DynSizeに぀いおあなたが䞊で曞いたこずに実際には埓いたせんでしたが、ずにかく今はすべお時代遅れだず思いたすか だから、私はあなたの最新の投皿にコメントするだけです。

芁玄するず、構造䜓/列挙型のフィヌルド pubフィヌルドを含むぞの射圱は䞀般に安党Drop実装しオプトむンできDrop 。 型はデストラクタを望んでいるなら、それはに持っおいるPinDropの代わりにDrop 

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

我々はすでにのためです。TypeCheckの倖芳を持っおいるDrop 、たた、チェックするために非珟実的なようではありたせんので、フィヌルドの倖に移動拒吊するDropを通じお投拒吊する&pin 。 もちろん、「フィヌルド倖ぞの移動」チェックは、 PinDropがある堎合でも拒吊されたすが、その堎合は予枬が蚱可されたす。

コンパむラは、 Dropに適甚されるのず同じ制限をPinDropに適甚したす。さらに、型がDropずPinDrop䞡方を実装しないようにしたす。 ドロップグルヌを生成するずき、タむプが実装したあらゆる皮類のDropを呌び出したす。

それは提案を芁玄しおいたすか 私が理解しおいない郚分はあなたの最埌の段萜です、あなたが心配しおいるこずを瀺す䟋を挙げおいただけたすか


さお、もちろん、私はここで蚌明矩務が䜕であるか疑問に思っおいたす。 これを確認する最も簡単な方法は、 PinDropが実際には正匏に存圚する唯䞀の䞻芁なデストラクタであり、 impl Drop for Tは実際にはimpl PinDropシンタックスシュガヌであるず蚀うこずだず思いたす。安党でないメ゜ッドPinMut::get_mutを呌び出しおから、 Drop::drop呌び出したす。 これは自動生成された安党でないコヌドですが、ピン留めは「ロヌカル拡匵」であるため぀たり、既存の安党でないコヌドず䞋䜍互換性がありたす、特定のタむプがピン留めを気にしない堎合、その安党でないコヌドは垞に安党です。

もう少し正匏に蚀えば、䜜成者がピン留めを気にしない堎合にタむプが持぀「デフォルトのピン留め䞍倉条件」がありたす。 そのデフォルトのピン留め䞍倉条件を䜿甚するタむプは、自動的にUnpinたす。 カスタム䞍倉条件を持぀タむプにimpl Dropを曞き蟌むず、そのタむプは「デフォルトのピン留め䞍倉条件」を䜿甚するず䞻匵したす。 ここに蚌明矩務があったように感じるので、これは少し怪しいですが、これに぀いお譊告するunsafeはありたせん-実際、これは完党ではありたせんが、䞋䜍互換性が重芁なので、䜕ができたすか行う。 これが実際に意味するこずは、安党でないコヌドが「デフォルトのピン留め䞍倉条件」で機胜しなければならないずいう範囲で、安党でないコヌドで発生する蚌明矩務を倉曎するこずであるず䞻匵できるため、これも倧惚事ではありたせん。 このモゞュヌルの他の堎所に安党でないコヌドがない堎合は、すべお問題ありたせん。

T: Unpinでない限り、 impl Drop for Tに察しお糞くずを远加できるず想像するこずもできたす。おそらく、型を定矩するモゞュヌルに安党でないコヌドが含たれおいる堎合に限定されたす。 これは、問題に぀いお人々を教育する堎所であり、 unsafe impl Unpin デフォルトのピン留め䞍倉条件を䜿甚するこずを正匏に䞻匵するたたはimpl PinDropいずれかを奚励したす。

@RalfJung

それは提案を芁玄しおいたすか

はい、倚かれ少なかれDropが実装されおいない堎合、自動的にプロゞェクションを実行するこずを提案しおいるように芋えるので、あなたの提案は実際には私の提案よりもはるかに野心的だず思いたす。これはおそらくラむブラリの䞊䜍互換性の問題だず思いたすが、䜕らかの方法があるかもしれたせん。それ。

私が理解しおいない郚分はあなたの最埌の段萜です、あなたが心配しおいるこずを瀺す䟋を挙げおいただけたすか

倧たかに蚀えば、同じ構造䞊に盎接存圚する2぀のフィヌルドが心配です。䞀方は、ドロップが呌び出されたずきにもう䞀方を倉曎したすおそらく、安党のためにドロップ順序などに䟝存したす。他のフィヌルドですが、その構造的敎合性は保持されたすしたがっお、ピン留め䞍倉条件の違反を目撃できたす。 これは明らかに完党に安党なコヌドを䜿甚するこずはできたせんそうでなければ、ずりわけdropckによっお拒吊されたすので、私の懞念は、フィヌルドが別々に固定されおいるずきにフィヌルドタむプのデストラクタが安党に実行できるずいういく぀かの仮定のケヌスに぀いおのみです構造物ですが、同じ構造物に固定されおいる堎合は安党ではありたせん。 フィヌルドが含たれおいる構造を含む共有䞍倉条件がない限り、そのようなケヌスがないこずを願っおいたす。 そのような䞍倉条件がある堎合、そのコンポヌネントがカスタム䞍倉条件を適切に尊重しおいないこずに泚意する必芁があるこずを知っおいるため、モゞュヌルのどこかでコヌドを非難するこずができたす。

これを確認する最も簡単な方法は、PinDropが実際に正匏に存圚するメむンで唯䞀の皮類のデストラクタであり、impl Drop forTは実際には安党でないメ゜ッドPinMut :: get_mutを呌び出しおから呌び出すimplPinDropの構文糖衣構文であるず蚀うこずだず思いたす。ドロップ::ドロップ。

同意したした。 残念ながら、この方法は、ラむブラリで凊理を実行しようずするため、珟圚の゜リュヌションに察しお開かれおいたせんでした。

もう少し正匏に蚀えば、䜜成者がピン留めを気にしない堎合にタむプが持぀「デフォルトのピン留め䞍倉条件」がありたす。 そのデフォルトのピン留め䞍倉条件を䜿甚するタむプは、自動的にピン留め解陀されたす。 カスタム䞍倉条件を持぀タむプに察しおimplDropを蚘述するず、そのタむプは「デフォルトのピン留め䞍倉条件」を䜿甚するず䞻匵したす。 ここに蚌明矩務があったように感じるので、これは少し怪しいですが、これに぀いお譊告するのは危険ではありたせん-実際、これは完党ではありたせんが、䞋䜍互換性が重芁なので、䜕ができたすか

はい、これは倧たかに私が考えおいるこずです...この「モゞュヌル内の安党でないコヌド」の保蚌を実際に圢匏化するこずの意味に぀いお、私には十分な盎感がないのではないかず心配しおいたす。 私はあなたの糞くずのアむデアが奜きです実際、PinDropを䜿甚する人を増やすものは䜕でも奜きですが、 unsafe impl Unpinはおそらくあたりにも頻繁に間違っおいるので、提案するのは良いこずではないず思いたす。少なくずも䞀般的なパブリックフィヌルドを持぀型の堎合ただし、そのようなフィヌルドを持たない構造の堎合、実際にはかなり頻繁に圓おはたりたす...たずえば、暙準ラむブラリの堎合はほが圓おはたりたす。

#[derive(PinnedFields)]がどのように機胜するかの䟋を曞きたした https 

私は人々がこのような掟生物は「健党ではない」が真実ではないafaikであるず䞻匵するのを芋おきたした。 この掟生によっお生成されたコヌドず競合する䜕かを行うには、安党でないコヌドを䜿甚する必芁がありたす-぀たり、これにより他の安党でないコヌドが䞍健党になりたすそしお、コヌド ?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だけ自分自身を取る

固定されたフィヌルドぞの䞍健党なアクセス+ドロップが原因で発生する可胜性のある皮類の䟋を次に瀺したす

タむプFooは、内郚バッファヌをある皮の倖郚APIに枡しおおり、明瀺的にリンクが解陀されるたでバッファヌをそのたたにしおおく必芁がありたす。 これは@cramertjが提案した制玄の䞋で健党であるず私が知る限り、 Pin<Foo>が䜜成された埌、 Dropが呌び出されるたで移動されないこずが保蚌されたす代わりにリヌクされる可胜性があり、 Dropが呌び出されるこずはありたせんが、その堎合は移動されないこずが保蚌されたす。

次に、タむプBarは、 Drop実装䞭にFoo移動するこずにより、これを砎りたす。

DMAを介しお通信する無線呚蟺機噚をサポヌトするためにFooず非垞によく䌌た構造を䜿甚しおいたすが、無線によっお曞き蟌たれる内郚バッファヌを備えたStableStream持぀こずができたす。

@withoutboats

これは正解

はい。ただし、実際には䜕もしないDrop implは生成されたせんRustでDropを実装しないタむプの方が䞀般的にうたく機胜するため。 代わりに、 Dropがいく぀かの魚のようなラむブラリ機胜を䜿甚しお実装されおいないこずを䞻匵しようずしたす安定しお動䜜したすが、特殊化の䞋で壊れたす-特殊化の䞋で動䜜するはずのバリアントがあるず思いたすが、珟圚は動䜜したせん関連する定数に関する問題の。 蚀語機胜にした堎合、これを匷制するのは非垞に簡単です。

たた、䟵入的なコレクションをサポヌトするためにPinの保蚌を拡匵した堎合にのみ、このすべおが問題になるず思いたす。 これは、 @ ralfjず@pythonesqueの理解ず䞀臎しおいたすか

いいえ、残念ながらそうではありたせん。 䞊にリンクされた反䟋は、䟵入的なコレクションに察する远加の保蚌ずは䜕の関係もありたせん。 Pin 'd型は、ピン留めされた参照の背埌から倀に察しおメ゜ッドが2回呌び出された堎合、その倀がそれが2぀の呌び出しの間を移動したかどうかを知る方法はありたせん。 煩わしいコレクションに圹立぀ようにするために必芁な远加の保蚌は、メモリが解攟される前にdropを呌び出さなければならないずいう远加のこずを远加したすが、その保蚌がなくおもdropは䜕かで呌び出すPinBoxフィヌルド倀、次に、以前に固定されたずきからの参照がただ有効であるず期埅しおいるメ゜ッドを呌び出したす。 私はそれを回避する方法を実際には芋おいたせん。 drop実装できる限り、むンラむンの!Unpinフィヌルドでこの問題が発生する可胜性がありたす。 だからこそ、最も悪い解決策は、ピン留めしお正しく機胜させたい堎合に、 drop実装させないこずだず思いたす。

ドロップはピンで自分自身を取るべきであるこずが明らかであるため、これはすべおかなりむラむラしたす より根本的なおそらく画期的な倉曎を加えるこずは魅力的なようですが、それほど砎壊的ではない方法は芋圓たりたせん。

ええ、それは本圓に迷惑です...私はそれに぀いお玄1週間非垞に䞍機嫌でした。 しかし、ラルフが指摘したように、誰かがこれを理解する前に、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お、固定されたメ゜ッドを呌び出すこずができたす。 安党ではありたせん。 固定されたフィヌルドを投圱できなくおも問題にならない唯䞀の理由は、 unsafeを䜿甚しお奇劙な!Unpinメ゜ッドを実際に実装するたたは、実行する型ず䞍倉条件を共有する型に受け入れられるず芋なされるためです。 安党なコヌドのみを䜿甚しおいる堎合でも、 drop実装に蚌明矩務を負わせる。 しかし、たたたた!Unpin型が含たれおいお、それ自䜓に安党でないコヌドがない型に぀いおは、尋ねるこずはできたせん。

@pythonesque

Dropが実装されおいない堎合、自動的にプロゞェクションを実行するこずを提案しおいるように芋えるので、あなたの提案は実際には私の提案よりもはるかに野心的だず思いたす。これはおそらくラむブラリの䞊䜍互換性の問題だず思いたす。 しかし倚分それを回避する方法がありたす

やがおやりたいず思いたす。 互換性の問題はどうですか

同じ構造に盎接存圚する2぀のフィヌルドが心配です。䞀方は、ドロップが呌び出されたずきにもう䞀方を倉曎しおそらく、安党のためにドロップ順序などに䟝存したす、もう䞀方のフィヌルドの固定䞍倉条件に違反したす。ただし、その構造的敎合性は保持されたすしたがっお、ピン留め䞍倉条件の違反を目撃できたす。

しかし、それは珟圚すでに違法です。 他人の䞍倉条件に違反しおはなりたせん。

しかし、少なくずも䞀般的なパブリックフィヌルドを持぀タむプの堎合、安党でない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のコメントも参照しおください。 珟圚、ピン留めの党䜓に自信が持おるようになるたで少し埅぀必芁があるず感じおいたすが、実際、ポむンタヌの方向を超えおピン留めを匷制する意味はほずんどありたせん。
生のポむンタヌに察しおこれを行うこずに぀いお私がどのように感じおいるかはわかりたせんが、それらはあらゆる皮類のクレむゞヌな方法で䜿甚されるため、通垞、それらの自動特性に぀いおは非垞に保守的です。


@withoutboats

[derivePinnedFields]がどのように機胜するかの䟋を曞きたした https 

@pythonesqueはすでにこれを蚀っおいたすが、これは明確にするためですそのラむブラリは@MicahChalmerのドロップの問題でそれを䜿甚するず、実際にピン留めに䟝存しおいるピン留めされたタむプを壊すこずができたす。 これは、ドロップが呌び出されるこずに関する远加の保蚌ずは無関係です。 䟋がただ必芁かどうか教えおください。 ;

@RalfJung

その図曞通は䞍健党です。

明確にするために、掟生はunsafeであり、手動のDrop implず組み合わせお䜿甚​​するこずはできたせん。 掟生を䜿甚するこずにより、 Drop実装にリストされおいる悪いこずをしないこずを玄束したす。

https://github.com/rust-lang/rust/pull/50497はピン留めAPIを倉曎したす。最も重芁なのは、共有Pinを远加するためのスペヌスを確保するために、 Pin名前をPinMutに倉曎するこずです。将来的にはPin 。


明確にするために、掟生は安党ではなく、手動のDropimplず組み合わせお䜿甚​​するこずはできたせん。

同意したした、そのようにそれを危険にするこずはうたくいくでしょう。 テストでは珟圚のように芋えたすが、実際には安党でないずマヌクされおいたせんか

@RalfJungそうですね、珟時点ではそうは思いたせん。 私が今考えたもう1぀のオプションは、「安党な」バヌゞョンでそのタむプのDrop実装を䜜成し、 Drop他の手動実装をブロックするこずです。 これをオフにするためのunsafeフラグがある可胜性がありたす。 WDYT

@cramertjはい、それも機胜するはずです。 ただし、より制限的なdropckや、フィヌルドから移動できないなどの副䜜甚がありたす。

@pythonesqueず私は月曜日にこれに぀いお話し合うために電話をしたした。 これが芁玄です。

おそらく「正しい」振る舞いは、 Dropがピンで自己を奪うこずだったず結論付けたした。 ただし、それに移行するのは困難です。 私が信じおいる䜕らかの圢で゚ディションを倉曎するこずは可胜ですが、これは非垞に混乱を招くでしょう。

䞋䜍互換性のある倉曎は、 Dropを実装するために「ピンプロゞェクション」できるタむプに察しお䜕らかの圢で䞀貫性を欠くようにするこずです。 圌のリポゞトリでは、 @ pythonesqueは、耇雑な特性のセットからimplを生成するこずでこれを実装しおいたす。

少し単玔な組み蟌みフォヌムを想像するこずができたす。

  • マヌカヌ特性 PinProjectionず呌びたしょうは、タむプをピン投圱できるかどうかを制埡したす。 PinProjectionずDrop䞡方を実装するこずは、コンパむラヌの組み蟌みの魔法によっお䞀貫性がありたせん。
  • 別の特性PinDrop 、 PinProjectionを拡匵しお、 Drop代替デストラクタを提䟛したす。

もののようなピンの投圱方法を生成するための掟生は@pythonesqueず私はたたのimpls生成されたすが瀺されおいるPinProjectionタむプするために。

@withoutboats

おそらく「正しい」振る舞いは、Dropがピンで自己を奪うこずだったず結論付けたした。 ただし、それに移行するのは困難です。 私が信じおいる䜕らかの圢で゚ディションを倉曎するこずは可胜ですが、これは非垞に混乱を招くでしょう。

い぀かそのようなこずをしたいず思ったら、将来互換性のあるものを提案しおいるのでしょうか。

たずえば、私たちが決めたずしたしょう...

  • Drop魔法のように固定フォヌムず非固定フォヌムの䞡方を受け入れるようにする、たたは
  • Rust 2021ぞの自動アップグレヌドの䞀環ずしお、党員のDrop眲名を曞き盎したす:)

私はこれらのどちらも提案しおいたせんが、具䜓的な䟋なしに質問に答えるのは難しいようです。

@tmandryそれは本質的にアむデアです。

倧きな問題は、typeパラメヌタヌを移動する䞀般的な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デヌタを移動するための有効な䜿甚䟋はわかりたせん。したがっお、技術的には可胜であるが意図されおいないこの堎合、それは本圓に問題です。

@withoutboats

もう1぀の特性であるPinDropは、PinProjectionを拡匵しお、Dropの代替デストラクタを提䟛したす。

PinDropがPinProjection拡匵するのはなぜですか それは䞍芁のようです。

たた、タむプがUnpinない限り、 PinProjectionずDropは互換性がないず蚀うこずでたたはこれらの新しい区別/制限をすべお削陀する他の方法を芋぀けるこずで、これを少し賢くするこずができたす。 Unpinタむプの堎合。

@RalfJung PinDropずDropを䜕らかの圢で盞互に排他的にしたいず思いたす。 最終的には、さたざたなトレヌドオフでこれを実装する方法がいく぀かありたす。 小さな倉曎ではないので、RFCが必芁だず思いたす。

@withoutboats同意したした。 独占暩はPinDrop特別な扱いから生じる可胜性があるず思いたしたが、それを行うには明らかにいく぀かの方法がありたす。 Unpinタむプが気にする必芁がなければ、それは非垞に䟿利だず思いたす。 すべおのポむンタ型を無条件にUnpinするずずもに、これはおそらく人々がこれに぀いお知らなければならないケヌスの数を枛らすのに圹立぀でしょう。

@withoutboatsたた、人々がデストラクタのVecで䞀般的なデヌタを移動したい堎所に぀いお考えるこずができる䞻なむンスタンスIIRCの人々がしたいのでVecたも泚目に倀したす。 Vecを実際に気にするUnpin実装するこずはできたせんPin 。これは、実際には&mut Vec<T>たたはVec<&mut T>か䜕か。 これらはおそらく@RalfJungが提案した糞くずによっおunsafe impl UnpinではなくPinDrop簡単に移動できるようになるこずを願っおいたす。 理論的には、もちろん、 TをタむプのUnpinで制限するこずにより、垞に前者を実行できたすが、それはラむブラリのクラむアントにずっお重倧な倉曎になりたす。

たた、これは私たちが望むよりもいく぀かの特性を远加したすが、特性はほずんど誰のタむプシグネチャにも衚瀺されないものであるこずに泚意しおください。 特に、 PinProjectionは、 #[derive(PinFields)]マクロを蚘述しおいない限り、完党に無意味な境界です。コンパむラヌは、可胜であればPinProjectionが成立するかどうかを垞に刀断できるからです。タむプのフィヌルドが䜕であるかを理解し、それが圹立぀のはフィヌルドを投圱するこずだけです。 同様に、 PinDrop Dropがバりンドずしお䜿甚されるこずはほずんどないのず同じ理由で、 PinDropは基本的に䜕かのバりンドである必芁はありたせん。 トレむトオブゞェクトでさえほずんど圱響を受けないはずですい぀か「関連付けられたフィヌルド」を取埗しない限り、私は掚枬したすが、そのような新しい機胜を䜿甚するず、関連付けられたフィヌルドを持぀トレむトはPinProjectionタむプでのみ実装可胜であるこずが矩務付けられたす。その問題。

@RalfJung

やがおやりたいず思いたす。 互換性の問題はどうですか

SendたたはSyncを実装しないタむプを远加するだけで、どちらもコア蚀語にたったく圱響を䞎えないずいう違いがあるず思いたす。 それを完党に自動的に行うこずは、RustがCopyを凊理するために䜿甚した方法に類䌌しおいるようですタむプがCopyタむプのみを含み、 Drop実装しなかった堎合、タむプは垞にCopy Drop これは最終的に倉曎されお明瀺的になりたした。おそらく、特性 Drop を远加するず、それを認識せずに䞀般的なコヌドが砎損する可胜性があるずいう事実が気に入らなかったためです䞀貫性の党䜓的なポむントは远加であるため特性の実装は、䞋流の箱を壊しおはなりたせん。 これはちょうどで、ほが同じようでPinProjectionの代わりにCopy 。 私は実際に叀い振る舞いが奜きでした。 Copyがそうでない堎合、 PinProjectionこのように機胜するこずを正圓化するの

しかし、それは珟圚すでに違法です。 他人の䞍倉条件に違反しおはなりたせん。

ええ、これに぀いお考えれば考えるほど、問題になる可胜性は䜎くなりたす。

ほずんどの堎合、実際には正しいず思いたす

ええ、そうですが、ほずんどのタむプがPinを必芁ずするメ゜ッドを実装しおいないか、汎甚フィヌルドをパブリックずしお公開しおいないためです。 埌者は倉曎される可胜性は䜎いですが、前者は倉曎されたせん。珟圚!Unpinであるstdlibタむプの少なくずも䞀郚は、ピン投圱メ゜ッドを远加するこずを期埅しおいたす。その時点で、 unsafe実装は倉曎されたせん。もう有効ではありたせん。 ですから、私にはかなり壊れやすいもののように思えたす。 さらに、人々が曞かなければならない「ボむラヌプレヌト」の危険なコヌドの量が増えるのではないかず心配しおいたす。 SendずSync境界は、正しく実装されおいないのずほが同じ頻床で正しくunsafe impl 'dされおいるず思いたす。たた、 Unpinは、通垞、正しいバヌゞョンにはT制限はありたせん。 したがっお、人々をPinDrop向けるのが非垞に望たしいようですただし、生のポむンタヌ型に察しおそれを行うこずに慎重な理由は理解できたす。すでにunsafeコヌドがそうなるのではないかず心配しおいたす。考えずにunsafe implを実行する可胜性はさらに高くなりたすが、考えれば考えるほど、生のポむンタヌのデフォルトはおそらく正しいように思われ、糞くずでフラグを立おるず䟿利です。

Unpinタむプが気にする必芁がなければ非垞に䟿利だず思いたす。

私はある皋床同意したすが、私が蚀ったように、人々は実際の境界ずしおPinProjectionを䜿甚しないので、実際にどれだけ重芁かはわかりたせん。 PinMutはすでにDerefMut実装があり、 T: Unpinため、今日はそれから䜕のメリットも埗られたせん。 コンパむラに実装されたルヌルプロゞェクション甚は、おそらくPinMut::newをUnpinタむプの䞀皮の&pin再借甚に倉換したすが、それは実際にはフィヌルドプロゞェクションずは関係ありたせん。 たた、 PinProjection導出する堎合、そのフィヌルドにPinProjectionは必芁ないため、別のタむプのderive範囲を満たすためだけに必芁になるこずはありたせん。 本圓に、利益は䜕ですか それが実際にできる唯䞀のこずは、 Dropを実装し、同時にPinProjectionsを導出するこずですが、ずにかく可胜であれば、垞に人々にPinDropを実装しおもらいたいず思いたす。正味の負のIMOになりたす。

IIRCの人々が実際にPinを気にするメ゜ッドをVecに実装したいので、Vecを遞びたした。぀たり、Unpinを無条件に実装するこずはできたせんでした。

うヌん、私はそれが奜きではないず思いたす。 Boxが無条件にUnpin堎合、 Vecは同じである必芁があるず思いたす。 2぀のタむプは通垞、所有暩がほが同等です。

たた、 drop保蚌にも泚意する必芁がありたす。 たずえば、 Vec::drainは、パニックの堎合に物事が挏掩する可胜性がありたす。

これは、コピヌの代わりにPinProjectionを䜿甚しただけで、ほが同じように芋えたす

ああ、今私はあなたの質問を理解しおいたす。 私の提案にはそのような特性がなかったので、実際にはPinProjections自動導出に぀いお話しおいたせんでしたが、実際、私の提案の1぀の結果は、 Dropを远加するこずは重倧な倉曎であるずいうこずです。パブリックフィヌルドがありたす。

実際に実行できるのは、Dropの実装ずPinProjectionsの掟生を同時に行うこずだけですが、可胜であれば、ずにかくPinDropを実装しおもらいたいので、正味の負のIMOになりたす。

それが実際のポむントでした。 これらすべおのピン留めに぀いお気にする必芁のある人が少なければ少ないほどよい。

明確化の質問あなたず@withoutboatsの提案では、 PinDropはlangアむテムであり、コンパむラによっおDrop代わりずしお扱われたすか、それずもderive(PinProjections)によっお䜿甚される特性だけですか Drop 

たた、萜䞋保蚌にも泚意する必芁がありたす。 たずえば、Vec :: drainはパニックの堎合に物が挏れる原因ずなる可胜性がありたす。

たあ、それは本圓ですが、実際にはメモリの割り圓おを解陀したせんよね 明確にするために、 VecがUnpin無条件に実装するこずを実際に奜むのは、人々がPinDropに切り替えるのが簡単になるからですが、確かに話し合いがありたしたバッキング芁玠に固定できるようにするこずに関する固定に関する議論の䞀郚。 固定されおいるフィヌルドに぀いお話し始めるず、垞にVecをBox<[T]>に倉換しお固定できるずは限らないこずが明らかになりたす。そのため、実際には明らかにあなたも远加できるものの、その点PinVecの代わりに入力しVecなどのために行われた、タむプをBox 。

それが実際のポむントでした。 これらすべおのピン留めに぀いお気にする必芁のある人が少なければ少ないほどよい。

うヌん、私の芳点からは、最初はそうですが、長期的には、特にタむプが実際に#[derive(PinProjections)]に悩たされおいる堎合は、できるだけ倚くの人をデフォルトの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倧きな懞念事項は1぀だけだず思いたすが、それはかなり重芁な問題です。 RFCは、最終的な&pin mutタむプが、ある時点でこの皮のコヌドを安党にする可胜性があるこずを理解しお承認されたした。

struct Foo<T> { foo : T }

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

この皮のコヌドが安党であるこずが重芁です。実際には、固定された参照は安党なコヌドでは実際には構成できないため、たずえば、futureコンビネヌタを実装するには、 unsafe䜿甚する必芁がありたす。 圓時、 unsafeの䜿甚はほずんどの堎合解陀できるず考えられおいたので、倧したこずではありたせんでした。

残念ながら、これが安党かどうかは、 FooのDrop実装に䟝存したす。 したがっお、安党なフィヌルドプロゞェクションをサポヌトしたい堎合蚀語機胜、カスタム#[derive] 、たたはその他のメカニズムを介しお、そのような悪いDrop実装ができるこずを保蚌できなければなりたせん。起こりたせん。

最適に機胜するず思われる代替方法では、䞊蚘のコヌドをunsafe䜿甚せずに構造の䞊に#[derive(PinProjections)]を远加するだけで機胜させるこずができ、既存のコヌドを壊すこずもありたせん。 。 Pinがすでに安定しおいる堎合でも、逆方向に远加できたす。たた、玔粋なラむブラリずしお远加するこずもできたす人間工孊的に深刻な打撃を受けたす。 アクセサを生成するための#[derive]マクロず、最終的な&pinネむティブ参照型の䞡方ず互換性がありたす。 少なくずも1぀の新しいトレむトおよびDropの固定バヌゞョンの実装方法によっおは2぀を远加する必芁がありたすが、 where句たたはトレむトオブゞェクトのどこにも衚瀺される必芁はありたせん。 dropの新しいバヌゞョンは、珟圚Drop実装があり、ピンプロゞェクションをオプトむンしたいタむプにのみ実装する必芁がありたす。

゜リュヌションに倚くの欠点がないように芋えるからずいっお、それが実質的な倉曎ではないこずを意味するわけではないので、この提案のRFCをほが確実に䜜成するず思いたす @withoutboatsず私は電話でこれを行うこずに぀いお話し合いたした 。 完党な䞋䜍互換性があるため、単独でパントするのは問題ありたせん。 ただし、個人的には、他の堎所での固定を取り陀くよりも、この倉曎をプッシュする方が理にかなっおいるず思いたす。

パブリックAPIのPinMutに関するほずんどの人の懞念は、 unsafeたたはUnpin境界をどこでもスレッド化する必芁があるずいうこずです。この提案は、その問題を解決したす。 rust-lang / rfcs2418で説明されおいる代替案は、ピン留めパブリックAPIやドキュメントに衚瀺される他のさたざたな特性の急増を䌎うの凊理を回避したい方法の実際のメカニズムの䞡方で、はるかに物議を醞しおいるようです。゜リュヌションの党䜓的な耇雑さにおいお。 確かに、ピン留めが完党に解決されたずしおも、そのRFCで十分に解決されたずは思わない質問がたくさんあるず思いたす。したがっお、RFCが安党なピンプロゞェクションを远加するこずになる可胜性は少なくずも十分あるず思いたす。その前に受け入れられおいたす。

確かにピン留めは初期の段階ですが安定化が早すぎるように思われるず䞍満を蚀っおいたした、安党なフィヌルドプロゞェクションの欠劂が、人々がピン留めをたったく䜿甚しないようにする最埌の倧きな芁因だず思いたす。 。 完党を期すために、ピン留めで人々が提起するすべおの問題、提案された解決策、および解決策が既存のPinタむプず䞋䜍互換性があるかどうかを以䞋に瀺したす非垞に倧たかな、偏った順序で物議を醞す私はこの問題が珟時点であるず認識しおいたす

  • これ投圱フィヌルドを安党なコヌドで実行させるこずはできたすか 今埌のRFCによっお解決される予定です可胜な実装戊略、および怜蚎した他の代替案ず、それらを砎棄する必芁がある理由が詳しく説明されたす。 提案された解像床のすべおのバリ゚ヌションには、䞋䜍互換性がありたす。
  • !Unpinタむプの倀を手動デストラクタで固定するこずは、远加の保蚌デストラクタが呌び出されるたで倀のバッキングメモリが無効にならないこず、別名「䟵入型コレクションの倉曎」を意味する必芁がありたすか

    提案されたスタック固定APIを壊す可胜性があるため、ただ解決されおいたせん。 この保蚌を保持するスタックピン留めAPIを非同期/埅機で動䜜させるこずができれば、ほずんどの利害関係者はこれを受け入れおも構わないず思っおいるようですIIRCの誰かがすでにゞェネレヌタヌを䜿甚しおこれを解決しようずしたしたが、ラストICEしたした。

    叀い保蚌ずの䞋䜍互換性はありたせん。 今のずころ保蚌を実斜するために安党でないコヌドを芁求するこずは、考えられる䞡方の結果ず互換性がありたすが、安党でないコヌドが正確さのために実斜されおいるこずに䟝存するこずが蚱可されおいない堎合に限りたす。 したがっお、これには、ピン留めが安定する前に、いずれかの方法で解決する必芁がありたす。

    幞い、 Futureのピン留めのナヌザヌは、スタックピン留めAPIの圢状に加えお、これを無芖できたす。 クロヌゞャヌベヌスのスタックピン留めAPIはどちらの解像床ずも互換性があるため、async / awaitを䜿甚しおいないFutureナヌザヌは、これが決定されるのを埅たずに、クロヌゞャヌベヌスのAPIを今日䜿甚できたす。 この決定は、他の目的䟵入的なコレクションなどにピン留めを䜿甚したい人に最も圱響を䞎えたす。

  • 生のポむンタは無条件にUnpinたすか ただ解決されおいたせん私はそれを提案したのは私だけだず思いたす、そしお私はただそれに぀いおほが50-50です。 䞋䜍互換性はありたせん。 私はこれを䞻にその理由で物議を醞すものずしおマヌクしおいたす。
  • Vecような暙準ラむブラリタむプを無条件にUnpinにする必芁がありたすか、それずもPinフィヌルドアクセサヌを远加する必芁がありたすか ただ解決されおおらず、ケヌスバむケヌスで解決が必芁な堎合がありたす。 任意の安党なラッパヌタむプに぀いお、アクセサヌを远加するか、タむプを無条件にUnpinは、䞋䜍互換性がありたす。
  • PinMut::derefを削陀する必芁がありたすか それを維持するこずの利点が欠点をはるかに䞊回っおいるように芋えるので、答えは基本的に「いいえ」のようです。元々人々にそれを欲しがらせた堎合具䜓的にはPin<RefCell<T>> の回避策があるようです。 それを倉曎するず、埌方互換性がなくなりたす。
  • ドロップの問題を無芖しお短期的にフィヌルドアクセサヌをどのように提䟛する必芁がありたすか ただ解決されおいたせん。これたでに提瀺された2぀のオプションは、 https://github.com/pythonesque/pintrusiveです。 ドロップの倉曎埌、これは玔粋にラむブラリコヌド内のマクロで適切に実行できるため、解像床には完党な䞋䜍互換性がありたす。
  • 長期的にフィヌルドアクセサヌをどのように提䟛する必芁がありたすか぀たり、カスタムの&mut pinおよび&pin Rustタむプが必芁ですか再借甚はどのように機胜する必芁がありたすか。 ただ解決されおいたせんが、他のすべおの提案された倉曎ず䞋䜍互換性があり私の知る限り、明らかに無期限にパントされる可胜性がありたす。
  • 安党な参照のようなタむプは無条件にUnpinたすか 解決されたようですはい、そうすべきです。 解像床には完党な䞋䜍互換性がありたす。
  • フィヌルドアクセサヌを実珟可胜にするために、䞀意のPin Pinタむプに加えお、共有の&Pin 、ぞの参照であるため、 PinをPinMutし、共有ケヌスにPinタむプを远加するこずPinからPinMut はすでに行われおおり、これはすでに効果的に受け入れられおいるず確信しおいたす。

私はそれをほがカバヌしおいるず思いたす。 ご芧のずおり、今日ピン留めが安定しおいおも、それらすべお生のポむンタヌずderefの決定を陀いお、埌者はこの時点で倧郚分が解決されおいるようですには䞋䜍互換性のあるパスがありたす。 さらに重芁なこずに、フィヌルドプロゞェクションを解決できるずいう事実は、APIで固定型を䜿甚するこずが、埌で埌悔する決定になる運呜にないこずを意味したす。

䞊蚘の質問に加えお、はるかに基本的な方法でピン留めを再考するこずを目的ずした他の提案がありたした。 二人は私が最もよく理解させるために@comex案だず思うこずを!Unpin皮類!DynSized 、そしおsteven099内郚で、申し蚳ありたせんが、私はGitHubの名を知らないぞの提案を内郚を動かせないようにする新しいサむズのないPinnedラッパヌタむプがありたすZSTラッパヌのようなものです。

!DynSizedオプションは、䞍透明OPAQUE型を凊理するためにすでに必芁になる可胜性があるずいう利点があるRustがすでに同様の特性を利甚できるずいう意味でかなり保守的な機胜です。 この意味で、提案されおいるDropぞの倉曎よりも䟵襲性が䜎い可胜性がありたす。 たた、高い利点もありたす。 !Unpinタむプは!DynSizedになるため、 Dropの問題は自動的に解決されるため、そこから移動するこずはできたせん。 これにより、 &mut Tず&T自動的にPinMutずPinずしお機胜し、 Tが!DynSized堎合は、次のようになりたす。 &mut T動䜜するタむプずメ゜ッドの固定バヌゞョンを急増させる必芁はありたせん必芁のないずきにDynSizedバむンドを必芁ずしないように修正された堎合。 。

䞻な欠点 ?Traitに関する通垞の懞念を陀くは、 !Unpinタむプを移動できないこずであるように思われたす。これは、珟圚ピン留めされおいるタむプの状況ずはたったく異なりたす。 これは、参照を䜿甚せずに2぀の固定タむプを䜜成するこずは実際には䞍可胜でありずにかく、私が知る限り、これに察する解決策が提案されおいるかどうかはわかりたせん。 IIRCこれは、 &move提案ず䞀緒に機胜するこずを目的ずしおいたしたが、その意図されたセマンティクスが䜕であるかはわかりたせん。 たた、䞍透明OPAQUE型に䟝存しおいるため、提案から安党なフィヌルドプロゞェクションを䜿甚する方法もわかりたせん。 それを䜿甚するには、䞀般的に倚くの安党でないコヌドを䜿甚する必芁があるようです。

サむズなしのPinned<T>タむプは、粟神的には倚少䌌おいたすが、タむプをZSTでラップしお動かせないようにするこずで、䞊蚘の問題を回避したいず考えおいたす効果的にサむズなしで動䜜したす。 珟時点では、Rustにはこれに匹敵するものはありたせん。 PhantomDataは実際には型のむンスタンスが含たれおおらず、他の動的なサむズの型はファットポむンタヌを生成し、移動を蚱可したす size_of_val䟝存するAPIを䜿甚 ?DynSizedが修正するこずを意図したものであるため、この提案はおそらくその特性に再び䟿乗したす。 安党な予枬を蚱可した堎合、この提案が実際にDrop問題を修正するようには思えたせん。たた、 Derefず互換性がないように思われるため、 Pinよりも優れおいたす。

この保蚌を保持するスタックピン留めAPIを非同期で動䜜させるこずができれば、ほずんどの利害関係者はこれを受け入れおも構わないず思っおいるようですIIRC誰かがすでにゞェネレヌタヌを䜿甚しおこれを解決しようずしたしたが、ラストICEしたした

参考たでに、これはおそらくhttps://github.com/rust-lang/rust/issues/49537を参照しおいこの詊みからのものです。 ただし、ICEが解決されたずしおも、そこでの存続期間が機胜するかどうかはわかりたせん。

提案されたスタック固定APIを壊す可胜性があるため、ただ解決されおいたせん。 この保蚌を保持するスタックピン留めAPIを非同期/埅機で動䜜させるこずができれば、ほずんどの利害関係者はこれを受け入れおも構わないず思っおいるようですIIRCの誰かがすでにゞェネレヌタヌを䜿甚しおこれを解決しようずしたしたが、ラストICEしたした。

クロヌゞャヌベヌスのスタックピン留めAPIは、これに察する解決策であり、より人間工孊的でコンパむラヌによっおチェックされる将来の手段 &pinが蚀語プリミティブになるずがありたす。 @cramertjによっお提案されたこのマクロベヌスの゜リュヌションもありたす。

生のポむンタを無条件に固定解陀する必芁がありたすか [...]䞋䜍互換性はありたせん。 私はこれを䞻にその理由で物議を醞すものずしおマヌクしおいたす。

impl Unpin for Vec<T>远加には䞋䜍互換性があるのに、生のポむンタヌに察しお同じこずを行うのはなぜそうではないず思うのですか

䞻な欠点Traitに関する通垞の懞念に加えおは、Unpinタむプを移動できないこずであるように思われたす。これは、珟圚のピン留めタむプの状況ずはたったく異なりたす。 これは、参照を䜿甚せずに2぀の固定タむプを䜜成するこずは実際には䞍可胜でありずにかく、私が知る限り、これに察する解決策が提案されおいるかどうかはわかりたせん。 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 }
}

したがっお、2぀の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) }
    }
}

ただし、既存の蚭蚈ず同様に、マクロでは、ナヌザヌがTwoGeneratorsに察しおDropを実装できないようにする必芁がありたす。 䞀方、理想的には、コンパむラヌはimpl Drop for Pinned<TwoGenerators>を蚱可したす。 珟圚、「ドロップの実装は特殊化できたせん」ずいう゚ラヌでこれを拒吊しおいたすが、倉曎される可胜性がありたす。 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っぜいデザむンを䜿甚する動機の䞀郚ずしお蚀及しおいるだけです。 &'a Pinned<T>は、ポむンタヌタむプの組み合わせ爆発を回避するため、すでにPin<'a, T>よりも優れおいるず思いたす。 しかし、それは同じ問題のいく぀かを継承したす

  1. 基本的に、初期の可動状態がないタむプはサポヌトしおいたせん。
  2. ノむズが倚く、混乱を招き同じ型ぞの固定参照ず非固定参照の違いを説明するのは難しい、䞍動の型は二流のように感じられたす。 動かせない自己参照型は、本質的に有甚であるず同時に、自己参照倀を簡単か぀䞀般的に䜜成できる他の蚀語から来た人々にずっおRustの芋栄えを良くするために、䞀流であるず感じおもらいたいです。

将来、私が想像しおいるのは、ネむティブの䞍動型が䞡方の問題を解決し、ほずんどのコヌドで「ピン」ずいう単語を䜿甚する必芁がなくなるこずです。  Pinnedはただいく぀かのナヌスケヌスがPinは「ただ固定されおいない」状態を、それを䜿甚するすべおの特性の蚭蚈に分離したす。 そしお、組み蟌みの&pinは、それを蚀語に焌き付けたす。

ずにかく、ここに䞊蚘のPinnedデザむンの遊び堎のリンクがありたす。

[1] ...静的なサむズであるが移動可胜である堎合ず移動できない堎合があるタむプの堎合、新しい特性ReallySized あたり愚かな名前ではないが必芁になる堎合がありたす。 サむズ倉曎されおいない右蟺倀がサポヌトされおいるため、珟圚Sized匕数をずる倚くの関数は、サむズが倉曎されおいないが移動可胜な関数でも同様に機胜する可胜性があるため、ずにかくここでチャヌンが発生したす。 既存の関数の境界ず、将来の関数に䜿甚する境界の掚奚事項の䞡方を倉曎したす。 将来の゚ディションで関数ゞェネリックのデフォルト暗黙のバむンドを倉曎する䟡倀があるかもしれないず私は䞻匵したすが、これにはいく぀かの欠点がありたす。

[線集修正されたコヌド䟋]

@RalfJung

クロヌゞャヌベヌスのスタックピン留めAPIは、これに察する解決策であり、より人間工孊的でコンパむラヌによっおチェックされる将来の手段pinが蚀語プリミティブになるずがありたす。 @cramertjによっお提案されたこのマクロベヌスの゜リュヌションもありたす。

クロヌゞャベヌスのものは、クロヌゞャ内から譲歩できないため、async / awaitでは正しく機胜しないず思いたす。 ただし、マクロベヌスのものは興味深いものです。 それが本圓に安党なら、それはかなり独創的です。 スコヌプのドロップの1぀でパニックが発生するず、他のリヌクが発生する可胜性があるため、最初はうたくいくずは思いたせんでしたが、MIRで修正されたようです。

たた、「メモリの割り圓おが解陀される前に実行されるデストラクタ」の保蚌ず、固定されたフィヌルドを投圱する機胜ずの間の盞互䜜甚に぀いおも確信が持おたせんでした。 トップレベルのドロップがパニックになった堎合、倀に投圱された固定フィヌルドではドロップが実行されないず思っおいたした。 ただし、Rustプレむグラりンドでは、トップレベルのタむプがパニックになった埌でも、このタむプのフィヌルドのドロップがずにかく実行されおいるように芋えたす。これは非垞に゚キサむティングです。 その保蚌は実際にどこかに文曞化されおいたすか スタックのピン留めがピンプロゞェクションで機胜する堎合は必芁ず思われたすたたは、PinDropが垞にパニックで䞭断するなど、より重いもので、DropずPinDropの機胜に違いが生じるため、望たしくないようです。

なぜVecにimplUnpinを远加するず思いたすか䞋䜍互換性はありたすが、生のポむンタに察しお同じこずを行うこずはできたせんか

私はあなたのポむントを理解しおいたす誰かが所有するVec<T>フィヌルドからの自動!Unpin実装に䟝存し、ピン留めが特定の!Unpin Tに察しお掚移的であるず想定した独自のアクセサヌを実装しおいる可胜性がありたすPinMut<Vec<T>>が実際にPinMut<T>を取埗するための安党な方法を提䟛しおいないのは事実ですが、安党でないコヌドはPinMut::derefを悪甚しお、生のポむンタヌを取埗し、ポむンタは安定しおいたす。 したがっお、これは、安党でないコヌドが!UnpinがVec たたはその他を掚移するこずに䟝存しない堎合にのみ䞋䜍互換性がある別の状況だず思いたす。 しかし、吊定的な掚論ぞのそのような倧きな䟝存は、ずにかく私には怪しいようです。 !Unpinであり、 Tでないこずを確認したい堎合は、い぀でもPhantomData<T>远加できたすこの匕数は生のポむンタヌにも圓おはたるず思いたす。 「タむプが明瀺的にオプトアりトするか、ドキュメントでこれが信頌できるず宣蚀されおいない限り、暙準ラむブラリのタむプが安党でないコヌドでUnpinであるず想定するのはUBです」のような包括的なステヌトメントでおそらく十分でしょう。

ただし、マクロベヌスのものは興味深いものです。 それが本圓に安党なら、それはかなり独創的です。 スコヌプのドロップの1぀でパニックが発生するず、他のリヌクが発生する可胜性があるため、最初はうたくいくずは思いたせんでしたが、MIRで修正されたようです。

ドロップ䞭にパニックが残りのロヌカル倉数のドロップをスキップするこずに぀ながる堎合、それはMIRのバグになりたす。 「通垞のドロップ」から「巻き戻しドロップ」に切り替えるだけです。 その埌、別のパニックがプログラムを䞭止したす。

@RalfJung

ドロップ䞭にパニックが残りのロヌカル倉数のドロップをスキップするこずに぀ながる堎合、それは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型が構築されたずきに、これがDropをTwoGenerators自䜓に眮き換えるず仮定しおもこれがどのように機胜するかはわかりたせんか、Rustはただ機胜したせんフィヌルドは倀によっお保持されるだけなので、投圱されたフィヌルドに察しおコンストラクタヌのPinnedバヌゞョンを呌び出すこずを知っおいたす。 固定されたバヌゞョンのデストラクタが存圚する堎合は垞に䜿甚されおいた堎合、これはPinDropず実質的に同じですが、構文がおかしいだけで、どのように優れおいるかわかりたせん。

ただし、倀がPinnedに基づいおいるかどうかを再垰的に分析するこずにより、デストラクタの遞択を怜蚎したくなるでしょう。 倀によるトレむトオブゞェクトを蚱可したい堎合、コンパむル時にPinned<T>ドロップを䜿甚するかTドロップを䜿甚するかを決定できるこずに必ずしも䟝存できないこずに泚意しおください。 このような堎合、 Pinnedバヌゞョン甚に別のvtable゚ントリがある可胜性があるず考えおいるず思いたすか このアむデアは私にずっお䞀皮の興味をそそるものです。 確かにかなりのコンパむラサポヌトが必芁です提案されたPinDropよりもはるかに倚いが、いく぀かの点で党䜓的に優れおいる可胜性がありたす。

ただし、スレッドを読み盎すず、他にも問題があるこずを思い出したす。固定された型のderef実装は、 Pinned<T>では実際にはうたく機胜したせんこれは、 deref実装が原因であるず思われたす PinMutは䜕らかの圢で論理的に間違っおいるため、問題が発生し続けたすが、無条件に倚数の型を䜜成しない限り、その利䟿性を考えるず、それを倱うこずを正圓化するのは非垞に困難です。 UnpinずにかくRefCell䟋は、 Pinned::derefが存圚する堎合、既存のタむプで動的にピン留めを匷制するこずさえできないこずを意味するため、かなり厄介だず思いたすわかりたせん専門化で十分な堎合。 これは、さらに我々が続ければこずを瀺唆しおいるderef実装を、私たちは、ほが同じくらいずAPIの衚面を耇補終わる必芁がありたすPinned我々がそうであるようにPin ; それを保持しないず、 Pinned<T>は驚くほど䜿いにくくなりたす。 たた、スレッドで指摘されおいるように ?DynSized ?Move別にBox<Pinned<T>>が機胜するようには芋えたせん。

これはすべお良い考えかもしれたせんが、珟圚のRustのコンテキストでは、特に珟圚のRustのメ゜ッドに?Move境界がないこずを考えるず、党䜓が魅力的ではないように芋えたす䞍足しおいるこずを意味したす。タむプがUnpinでない限り、 derefは本圓に痛いです。その堎合、 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堎合、䞍動の型によっお暗黙的に瀺されるず予想される特性は、メ゜ッドがPinMut<Self>を取る必芁があり、䞍動の型ぞの参照を取埗するゞェネリック関数はfn foo<T>(p: PinMut<T>)ように芋える必芁がありたす。䞀方、 Pinned蚭蚈では、 Pinned<MyStruct>特性を実装できるため、ほずんどの堎合、新しい特性の必芁性が回避されたす。 したがっお

  1. 䞍動の型は、メ゜ッドが&selfたたは&mut self取る既存の特性ず互換性がありたせん。たずえば、ゞェネレヌタヌはIterator実装できたせんPinMut<Self>取る新しい特性の束が必芁になりたす。 コヌスを倉曎しおPinMut<T>を&mut Pinned<T>゚むリアスにした堎合、戻っおこれらの重耇する特性をすべお非掚奚にするこずができたすが、それはかなりばかげおいたす。 そもそも重耇が必芁ない方がいいです。

  2. 䞀方、新しく蚭蚈された、たたはゞェネレヌタ固有のトレむトは、おそらくPinMut<Self>を唯䞀のオプションずしお䜿甚したすが、トレむトを実装したいが動かせず、必芁のないタむプにはノむズが远加されたす。固定されたす。 具䜓的には、 Self: Unpin想定するず、発信者は&mut selfからPinMut<Self> PinMut::newに移動するためにPin<T>が&mut Pinned<T>゚むリアスの堎合、そのノむズを取り陀く方法はありたせん。 そしお、私が想像しおいる将来のネむティブの䞍動型は、可動型ず同じ状況になり、垞に固定されおいるず芋なされるずきに、䞍必芁にPinnedでラップする必芁がありたす。

残りの投皿には2回目の投皿で返信したす。

Drop

Dropに぀いおあなたが蚀っおいるこずに少し混乱しおいたすが、 PinMutずの䞋䜍互換性を持たせようずしおいる限り、それに぀いおは考えたせん。それは良いアプロヌチではないず思うからです。

最善のアプロヌチは、 TwoGeneratorsような構造䜓がある堎合、2぀のオプションがあるこずだず思いたす。

  1. TwoGeneratorsたたはPinned<TwoGenerators>いずれにも手動のDrop implはありたせん。
  2. Pinned<TwoGenerators>に察しおDropを実装したす; 䞀方、アクセサを提䟛する同じマクロは、 TwoGenerators自䜓に察しおDrop implを生成したす。これは、単に自分自身を&mut Pinned<TwoGenerators>キャストし、それをドロップしたす。 これは安党です &mut Tを&mut Pinned<T>にキャストするために必芁な䞍倉条件は、借甚が終了した埌、 Drop堎合、 T移動しないこずです。 Drop 、その倀に察しお䜜成される最埌の借甚がありたす。

2぀のオプションがある唯䞀の理由は、前述のように、構造䜓にDropを実装させたくない堎合があるためです。これは、構造䜓を実装しない構造䜓は、借甚チェッカヌによっおより緩く扱われるためです。

ピン留めされた状態ずピン留めされおいない状態に察しお実際に別々のデストラクタが必芁な理由がわかりたせん。そのため、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は、他の提案からほずんど分離できるず思いたす。

ずにかく、䜿いにくい堎合は、同じ問題がピンにも圓おはたりたす。

もちろん、 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ある䞖界でderef 、ほずんどすべおのラむブラリがピン関連のアクセサなしで逃げるこずができ、それでも!Unpinタむプを半分たずもなサポヌトがありたす。

それどころか、「サむズ制限」を持぀ものはすべお暗黙的に「移動」されたす。

そうそう、それは良い点です。 残念ながら、Rustコヌドの党䜓は、デフォルトではないため、 !Sizedバむンドされたタむプでは機胜したせんが、少なくずも䞀郚は機胜したす。 サむズなしの倀で実行できるこずのほずんどは、それらのメ゜ッドスラむスや特性オブゞェクトなどで&たたは&mutメ゜ッドを呌び出すこずであり、どちらも呌び出されないため、それほど魅力的な利点ではないず思いたす。 Pinned::derefが必芁ないので、 Unpinタむプを陀いおあなたの提案の䞋でこれを行うこずができたす。 たぶん、䞀般的なケヌスは、 #[derive]実装で、 Pinned<T>などの個別のむンスタンスを生成するこずで察凊できたすか

Drop

個人的には、Dropを専門化するこずは非垞に疑わしい前䟋を蚭定し、ピン留めずは関係のない理由でほが確実に望たしくないず思いたす。したがっお、これを本質的な利点ずは芋なしたせん。 いずれにせよ、PinDropは他の提案からほずんど切り離すこずができるず思いたす。

これは分離可胜であるこずに同意したすが、疑わしいずは思いたせん。 少なくずも あなたが蚀ったこずは正しいです、それは専門化の䞀圢態です。 Drop芪ブランケットの実装を文字通り特殊化するわけではありたせんが、コンパむラが生成するドロップグルヌは、実装されおいる堎合にのみ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() }
}

したがっお、珟圚「特殊化された」ドロップimplを蚘述できない理由は、特殊化自䜓が珟圚䞍健党であるのず同じ理由であるず思いたす。぀たり、transラむフタむムパラメヌタヌを消去するずtypeckそうでないの間の䞀貫性がありたせん。 蚀い換えるず、たずえばimpl Drop for Foo<'static>ず曞くこずができれば、codegenは2぀のタむプが同䞀であるず想定しおいるため、実際にはFoo<'static>だけでなく、任意のFoo<'a>に察しお呌び出されたす。

良いニュヌスは、おそらくご存知のように、特殊なimplを制限しお、そのタむプのむンコヒヌレンスを䜜成できないようにする方法を芋぀けようずする詊みがあったこずです。 そしお、スペシャラむれヌションは最終的にはそのような制限付きで出荷されるず予想されたす。 それが起こったら、同じルヌルを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>が必芁になるため、可動タむプのこれらの特性の実装でさえ、 PinMutを受け取る必芁がありたす。 私が蚀ったように、 Pinnedを䜿甚するず、特性は匕き続き&selfたたは&mut selfを取り、 Pinned<MyStruct>それらを実装したす。 Vec<T>に同じ特性を実装したい堎合は、 Pinnedする必芁はありたせん。

ただし、朜圚的な゜ヌスの1぀は、フィヌルドアクセサヌマクロです。 あなたが持っおいる堎合

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 ; 将来、サむズ倉曎されおいない右蟺倀を䜿甚するず、 ptr::readずmem::swapずmem::replaceの境界 Sizedから緩和になりたす。 もし私たちが&move手に入れたら、それはあなたが1぀から抜け出すこずを可胜にするための限界になるでしょう。 同様のこずが、保蚌されたコピヌの省略にも圓おはたりたす。

したがっお、特性がある限り、 T: MoveバむンドされたPinned::deref およびderef_mut を持たない理由はありたせん。

[線集pythonesqueが私に思い出させたように、これはUnpinずは異なるセマンティクスを持っおいるので、気にしないでください。]

そしお、 VecやBoxようなタむプは、芁玠タむプがMoveであるかどうかに関係なく適甚されるように、手動でMove実装する必芁がありたす。

えヌず わかりたした、私の発蚀を蚂正させおください。 Pinned :: derefは存圚する必芁がありたすが、Unpinで制限されおいる必芁がありたす-これをMoveず呌びたす。

さお、埅っおください。 これは?MoveたたはMoveですか 前者は、倚くの堎合、 !Unpin型を構築するこずさえできないこずを意味したす。 埌者は、正確には、 Pinned<T>ようなタむプをどのように参照しおいるのか疑問に思いたす ?DynSizedは実際にはそれらに適切な境界ではないため。 私は確かにそれらが同じではないこずを願っおいたす-そうでなければ、 MoveをUnpinずしお扱うこずは、私たちが避けようずしおいる正確なこずをもう䞀床行い、タむプが構築された瞬間に動か​​ないようにしたす。

欠点は、Tを取埗するが、個別にSelfSizedバりンドを持぀特性たたは関数ず互換性がないこずです。 しかし、それらは比范的たれであり、しばしば意図的ではありたせん。

はるかに重芁な実甚䞊の欠点がありたす。それは、これらの特性たたは機胜のいく぀かが実際にPinnedで機胜するこずです。今日。 それらはそれで動䜜するようにするこずができたすが、それは膚倧な数の远加の特性実装を必芁ずし、私が蚀ったようにおそらく既存の#[derive]実装の倧幅なオヌバヌホヌルを必芁ずしたす。 これは、新しいものにも支払わなければならないコストでもありたす。 !Unpinタむプで機胜させるには、すべおを&Pinned<Self>実装する必芁がありたす。 これは、 PinMutよりも&mut selfをずる特性のはるかに良い状況ですが、 &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が䜿甚されたす、したがっお、可動タむプのこれらの特性の実装でさえ、PinMutを受け取る必芁がありたす。

承知したした Pinnedバヌゞョンの倧きな利点は、倉曎可胜な固定参照に明確な特性を必芁ずしないこずです。 ただし、他のほずんどすべおのシナリオでは、 PinMutよりも悪いか䞭立であり、 derefです。

ピン留めされたアクセサヌずピン留めされおいないアクセサヌの䞡方があるのは䞍健党ですが、どちらかそれ自䜓で問題ないはずです。

安党でないコヌドを実装するために安党でないコヌドを必芁ずする手動アクセサヌは、私には悪い考えのように聞こえたす。 そのような提案がアクセサの生成を安党にする方法がわかりたせんピン留めされおいないアクセサを提䟛しないようにunsafeを曞かせずに、誰かがそれを提䟛しないようにするにはどうすればよいですか。 ただし、ご存知のように、 Move 実際にはUnpin意味するず仮定しお正垞に機胜したす。

したがっお、トレむトがある限り、TMoveバりンドでPinned :: derefおよびderef_mutを䜿甚しない理由はありたせん。

承知したした。 ここでは特に!Unpinタむプに぀いお話したす。 Unpinタむプは、 PinMutでも構成䞊の問題がないため、私の芳点からはそれほど関連性がありたせん。 ただし、ゞェネリックのUnpin たたはMove の境界は快適ではなく、理想的には可胜な限り回避できるはずです。 繰り返したすが、前に蚀ったように、 Unpinず!Sizedによっお暗瀺されおいるものはすべお同じではなく、同じものずしお扱うこずはできないず思いたす。

 しかし、ええ、ピン留めではなく、移動特性が必芁です。 たずえば、これは新しいバヌゞョンのsize_of_valの境界の䞀郚になりたす。 将来、サむズ倉曎されおいない右蟺倀を䜿甚するず、ptr :: readずmem :: swapずmem :: replaceのバむンドSizedから緩和になりたす。 moveを取埗した堎合、それはあなたが1぀から移動できるようにするための境界になりたす。 同様のこずが、保蚌されたコピヌの省略にも圓おはたりたす。

これは、 !Unpin タむプがデフォルト以倖のピン留め䞍倉条件を持぀こずができるこずを意味したすず!DynSizedような!Move再び混同しおいるず思いたす。 望たしくないすくみ行動を匕き起こさずに、それらを実際に同じにするこずはできたせん。

おっず、あなたは完党に正しいです。 UnpinをMoveず同じにするこずはできたせん。

だから私はUnpinを信じるこずに戻ったず思うので、 Pinned::derefはたったく存圚しないはずです。代わりに、アクセサ生成マクロのような状況を回避する必芁がありたす。 &Pinned<MovableType>ようなタむプを取埗したす。 しかし、それは別の特性ずしお存圚すべきであるずいう議論があるかもしれたせん。

今回はPinnedだけで、 VecのAPIサヌフェスにすべおのトレむトを再実装するこずは、私にはそれほど玠晎らしいこずではありたせん特に、䞀郚のトレむトが機胜しないため。 ケヌスバむケヌスでDerefを遞択的に実装するかたずえば、 &Pinned<Vec<T>>を&[Pinned<T>]に移動させる、たたは単にVec党䜓を実装するかのどちらかだず確信しおいたす。 Unpin そしおピンの投圱を蚱可しないのは、はるかに正気です。

ええ、私は間違いなくVecのAPIサヌフェス党䜓たたはそのようなものを再実装するこずを提案する぀もりはありたせんでした。

&Pinned<Vec<T>>は無関係な䞍​​倉条件のように芋えるため、 Vecで「ピンプロゞェクション」を蚱可しないこずをお勧めしたす。 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バヌゞョンの倧きな利点は、倉曎可胜な固定参照に明確な特性を必芁ずしないこずです。 ただし、他のほずんどすべおのシナリオでは、 PinMutよりも悪いか䞭立であり、 derefです。

たた、他のものずの競合を犠牲にしお、 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の通垞の゚コシステムに基本的にオプトむンできないず、非垞に混乱したす実際、䞍動のタむプのほずんどすべおのナヌスケヌスは非垞に難しくなりたす。

私はあなたがここで䜕を意味するのか完党には理解しおいたせんが、それはあなたがUnpin察Move私自身の間違いに反応しおいたためかもしれたせん:)

これで修正されたした... Unpinが存圚する堎合、 Vecはそれを暗瀺するはずです。 しかし、それが存圚しないず仮定するず、あなたが参照しおいるシナリオは正確には䜕ですか

フィヌルドの1぀ずしおVecを持぀構造䜓の堎合、フィヌルドぞの固定されおいない参照を取埗する方法を䞊で説明したした固定された参照を取埗できないずいう犠牲を払っお、結構です。

typeパラメヌタヌに応じお、 Vec含む可胜性のあるフィヌルド、たたは䞍動の型を含む可胜性のあるフィヌルドを持぀ゞェネリック構造䜓が必芁な堎合、これは問題になるず思いたす。 ただし、実装するかどうかをすべおが考えなければならないUnpin特性を必芁ずせずに、これを解決する別の方法があるかもしれたせん。

@comex

別の方法ずしお、Vecからの栞倉換を蚱可するのはどうですかノェネトぞ>、ほずんどのVec APIがありたすが、再割り圓おを匕き起こす可胜性のあるメ゜ッドを省略しおいたすか

なぜなら...

぀たり、Vecの定矩を珟圚の構造䜓Vecから倉曎したす。Vecを構築する、少し銬鹿げた名前の堎合、基本的にSizedはActuallySized + Moveの゚むリアスになりたす。 次に、再割り圓おを匕き起こす可胜性のあるメ゜ッドず、倉換を行うメ゜ッドにSizedバりンドを远加したす。

...音は本圓に、本圓に耇雑で、それは実際にあなたがしたいこずをやっおいないこずこれは通垞の取埗Vec<T>行うの&mut Pinned<Vec<T>>たたは䜕でも。 それはあなたがに玠敵なアナログ埗るので、あなたは、事実の埌にベクトルを固定するこずができたすこずを䞀皮のクヌルなのであるBox<Pinned<T>> 、それは、盎亀心配です。 これは、所有されおいるタむプのプロパティであるピン留めがおそらく正しいずいう事実の単なる別の䟋です。 Unpinに関するすべおは、参照型がどのように構築されるかずいう問題ずはほずんど完党に無関係だず思いたす。

これで修正されたした... Unpinが存圚する堎合、Vecはそれを実装する必芁がありたす。 しかし、それが存圚しないず仮定するず、あなたが参照しおいるシナリオは正確には䜕ですか

私の䞻匵を説明するず思うので、これに応答したす。 Unpinがないず、 PinMutを介しおi32フィヌルドを倉曎するこずさえできたせん。 あなたの構造で䜕かをしたい堎合は、いく぀かの時点では、倚くの堎合、それは完党に䞍倉でない限りその䞭に䜕かを移動する必芁がありたす。 Pinned<MyType>フィヌルドアクセサヌを明瀺的に実装する必芁があるこずは、特に問題のフィヌルドが垞に安党に移動できる堎合は、非垞に煩わしいようです。 このアプロヌチは、組み蟌みのPinnedタむプで䜿甚するのは本圓に混乱するようです。これは、法的な予枬がフィヌルドタむプに䟝存しない方法でフィヌルドごずに異なるため、Rustではすでに拒吊されおいるためです。 mutフィヌルドが削陀されたずきそしおIMO、そのような泚釈を远加する堎合は、安党でないフィヌルドは実際には巚倧なフットガンであるため、 unsafeの方が適しおいたす。 組み蟌みの固定型は、固定された列挙型を䜿いやすくするためのほが唯䞀の方法であるため、他の蚀語ずある皋床䞀貫性を持たせるこずができるかどうかに泚意したす。

しかし、もっず重芁なのは...

タむプパラメヌタに応じお、Vecを含む可胜性のあるフィヌルド、たたは䞍動のタむプを含む可胜性のあるフィヌルドを持぀ゞェネリック構造䜓が必芁な堎合、これは問題になるず思いたす

これはUnpinのキラヌナヌスケヌスであり、私にずっお実際に機胜しおいるように芋えるずいう事実は非垞に玠晎らしく、ピン留めモデル党䜓を怜蚌したす私たちが始めたずしおも私が思うずころたで Rust 1.0より前は、おそらくUnpinそのたたにしおおきたいず思いたす。 構造内にむンラむンで存圚するゞェネリックパラメヌタヌも、珟圚の蚈画の堎合にUnpinバむンドする必芁がある唯䞀の時間ですほずんどすべおの安党な参照のような型に無条件でUnpin実装させるため通過したす。

しかし、私が実際に埗おいないのは、なぜUnpinを削陀したいのかずいうこずです。 それを排陀しおも、本質的に䜕も賌入したせん。 PinMut超えおPinnedから埗られるすべおの玠晎らしいものたたはその逆は、その存圚ずはほずんど関係がありたせん。 これを远加するず、Rust゚コシステムの他の郚分ず簡単に互換性がありたす。 FWIW、 Unpin 、およびPinでのderefの無条件実装も、 Unpinすべおのタむプが同じように感じるこずを陀いお、互いにほずんど関係がありたせん。 !Unpinタむプが行う苊痛぀たり、無条件のderef実装がより䟿利になる可胜性がありたす。 䜕かが足りないような気がしたす。

ドロップされる構造内の他のフィヌルドは、このコンテキストではロヌカル倉数ず芋なされたすか これは、ナヌザヌ向けのドキュメントからははっきりしたせん。

十分に公平なこずですが、これを远跡するためにhttps://github.com/rust-lang/rust/issues/50765を開きたした。


@pythonesque

具䜓的には、RefCellの䟋は、Pinned :: derefが存圚する堎合、既存のタむプで動的にピン留めを匷制するこずさえできないこずを意味するため、かなり厄介です特殊化で十分かどうかはわかりたせん。 これはさらに、derefの実装を維持する堎合、Pinを䜿甚する堎合ずほが同じようにPinを䜿甚しおAPIサヌフェスを耇補する必芁があるこずを瀺しおいたす。 それを保持しない堎合は、固定驚くほど䜿いにくくなりたす。

RefCellの解決策は、远加のメ゜ッドborrow_pinずborrow_pin_mut  Pin<RefCell<T>>を取るを提䟛し、 RefCell内郚の固定状態を远跡するこずです。実行時にPinMutずPinned䞡方で機胜するはずです。 それで、ここであなたの議論はPinnedが圹に立たないずいうこずですか RefCellでも、事態が悪化するこずはありたせん。

しかし、あなたは曞く

違いは、derefをサポヌトしながら、PinMutを䜿甚しお゜リュヌションをたずめるこずができるこずです。これは、Pinnedでは機胜しないようです。

䜕を蚀っおいるのかわかりたせんが、なぜこれが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ず同じ特暩を提䟛したす-以前はPinMutあったものに&mutを取埗できたす。 そしお、 Dropは安党です。぀たり、 Unpinは安党であるはずですこれはmem::forgetあり、リヌクポカリプスです。
  2. これは、ピン留め解陀ゞェネレヌタヌを凊理しない珟圚の先物ベヌスのAPIのようなものが、 self: PinMut<Self>  unsafe impl Unpin を䜿甚しおも、すべお100安党に実装できるこずを意味するためです。
  3. Unpinが安党な堎合、APIは適切ですか 答えはむ゚スです。ゞェネレヌタヌがUnpin実装しおおらず、プロゞェクトを!Unpinタむプに固定するのが安党でない限り、すべおが安党です。
  4. しかし、これはピンの突起が安党でないこずを意味したす 理想的ではありたせん。
  5. SelfがUnpinたたはDrop実装しおいない堎合、ピンの投圱は安党

Unpin完党に削陀し、代わりに極性を反転するこずを含む、このラむブラリAPIのより蚀語でサポヌトされる代替案に぀いお、いく぀かのアむデアがありたす-代わりに、これらの保蚌を取埗するこずを遞択Pin特性オプトアりトしたす。 しかし、これにはかなりの蚀語サポヌトが必芁ですが、珟圚の実装は完党にラむブラリベヌスです。 よく考えおからたた投皿したす。


私は忘れ続けおいるので別の泚意

ピンプロゞェクションの安党性は、フィヌルドタむプではなく、セルフタむプのみに䟝存したす。これは、フィヌルドタむプが、無条件であるパブリックAPIの安党性を保蚌する必芁があるためです。 したがっお、再垰的なチェックではありたせん。 SelfがPinから䜕も移動しない堎合は、どのタむプのフィヌルドにもピン投圱しおも安党です。

@withoutboats FWIWこれは、 @ cramertjず私が前回の議論で到達した結論ず

@withoutboats

基本的に、DropはUnpinず同じ特暩を提䟛したす。぀たり、以前はPinMutにあったものにmutを取埗できたす。 そしお、Dropは安党です。぀たり、Unpinは安党である必芁がありたすこれはmem :: forgetずleakpocalypseです。

リヌクポカリプスずの関係はわかりたせんが、そうではないこずに同意したす。 私が少し躊躇しおいる唯䞀の理由は、それがDropである限り、これは私にずっおはコヌナヌケヌスのように感じられ、倚くの人が気にする必芁がないずいうこずです。 それが利点かどうかはわかりたせんが。 そしおずにかく、安党なUnpinは、ここでの䞀貫性を高めるだけでなく、 Drop問題を特別なケヌスにするこずなく「解決」したす代わりに、すべおのimpl Dropように考えるこずができたす暗黙のimpl Unpin ; あなたの蚀うこずから、それは物事のFuture偎でも䜿いやすくなりたす。 だから、それは党䜓的な勝利のようです。

@pythonesque䜕かが足りない堎合を陀いお、安党なUnpinは、䟵入的なコレクションに察しおも新しい問題を匕き起こしたせんか 安党なDropにもかかわらず機胜した堎合でも、機胜するはずです。


@withoutboats

SelfがUnpinたたはDropを実装しおいない堎合、ピンの投圱は安党です[線集trueたたはfalse]そのチェックを自動化できたすか

最初にここでフィヌルドタむプに぀いおも蚀及したしたが、なぜそれが適切だず思うのかを尋ねようずしおいたした。 投皿を線集しおいるようです。 :)私はこれがSelfタむプに぀いおのみであるこずに同意したす。 以䞋では、私の蚀葉であなたの議論をほずんど繰り返したす。

基本的に、問題は次のずおりです。 Selfはどのようにしおピン留め䞍倉条件を遞択したすか デフォルトでは、安党でないコヌドが存圚する堎合でもピン留め䞍倉条件は所有されおいる䞍倉条件ずたったく同じであるず想定したす。぀たり、䞍倉条件は堎所に䟝存せず、このタむプはピン留めを行いたせん。 PinMut<T> &mut Tに倉換する以倖に䜕もできない限り、それは安党な仮定です。

フィヌルドプロゞェクションを有効にするには、ピン留め䞍倉条件を「すべおのフィヌルドがそれぞれのタむプの䞍倉条件でピン留めされる」必芁がありたす。 その䞍倉量は、フィヌルドタむプに関係なく、ピン留めの予枬を簡単に正圓化したす぀たり、必芁なピン留め䞍倉量を遞択できたす。 もちろん、この䞍倉条件はPinMut<T>を&mut Tに倉換するこずず互換性がないため、そのような型がDropたたはUnpinないこずを確認するこずをお勧めしたす。

リヌクポカリプスずの関係はわかりたせんが、そうではないこずに同意したす。

単なるアナロゞヌ-アンピンはmem :: forgetがRcサむクルにあるようにドロップするこずです。 mem :: forgetは元々安党でないずマヌクされおいたしたが、それを正圓化する理由はありたせんでした。 そしお、Rcサむクルが゚ッゞケヌスであるずいう同じ議論が、mem :: forget safeのマヌキングに察しお行われたした。

Discordから粟神的にコピヌしお貌り付けるず、問題を裏返しただけではないずいう蚌拠が本圓に欲しいです構造的なピンアクセサヌを実装するのが安党でないようにするこずで、Unpinを安党に実装できるようにしたすこれはどの堎合にも圓おはたりたす導入された安党でない特性ですよねそれでも安党でないコヌドを曞かなければなりたせん。 ほずんどの堎合、完党に安党であるため、これは私を悩たせたす-基本的に、型の明瀺的なUnpin implがない限り、型のDrop implがない堎合は垞に安党であるのず同じように、 我々ははるかに匷い䜕かを必芁ずしおいる珟圚の蚈画では、 -倚くの少ないタむプのためにtrueになりたすちょうど私たちは図曞通で行うこずができるすべおに぀いおです -タむプのための明瀺的な固定を解陀IMPLがあるはずです。

残念ながら、コンパむラが特定のタむプの手動のUnpin implがあるかどうかを、「実装がある」ずは察照的にチェックする方法やかどうかはわかりたせん。たた、特殊化ずの盞互䜜甚が悪いかどうかもわかりたせん。 型の䜜成者が構造的なピン留めを取埗するために安党でないコヌドを蚘述する必芁がないように、そのチェックを実行する明確な方法がある堎合、 impl Unpinが安党であるず私ははるかに幞せになるず思いたす...それは実珟可胜ず思われるこずですか

私は簡単な質問がありたす、私は今理解しようずしおいたす。 ゞェネリックでは、すべおのゞェネリックパラメヌタヌのAPIを陀いお、unpinはsizeedのような暗黙のバむンドになりたすか

それは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 。 それを削陀するか、 T: Unpin境界を導入するこずは、埌方互換性のない倉曎になりたす。

こんにちは
ピンアクセサヌを安党に動䜜させる方法に぀いお少し考えおきたした。 私の知る限り、ピンアクセサヌの問題は、 T: !Unpin + Drop組み合わせがある堎合にのみ発生したす。 そのために、私は、このようなタむプの可胜性を防止しようずしおいるいく぀かの議論を芋たT䟋えば圢質を䜜る-既存の!UnpinずDropさたざたな方法で盞互に排他的ではなく、そこに䞋䜍互換性を損なうこずなくこれを行う明確な方法ではありたせんでした。 この問題をさらに詳しく芋るず、タむプが!UnpinずDropになるのを劚げるこずなく、安党なピンアクセサヌを取埗できたす。そのようなタむプを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 、圌らのこずができるようになりたすunsafe impl Pinnableタむプは

*私は経隓がありたせんPin 、私は、誰かのニヌズにほずんどの堎合こずを願っおいたすimpl Dropであるタむプのための!Unpinによっお匕き起こされおいたせんドロップする必芁があるのは本質的に!Unpinですが、 Dropフィヌルドず!Unpinフィヌルドを持぀構造䜓が原因です。 この堎合、 Dropフィヌルドは、 !Unpinフィヌルドを含たない独自の構造䜓に分割できたす。 説明がおかしいず思うので、必芁に応じお詳しく説明したすが、コメントの本文を意図したものではないので、ずりあえず短くしおおきたす。

私の知る限り、ピンアクセサヌの問題は、TUnpin + Dropの組み合わせがある堎合にのみ発生したす。

それは「and」ずいうより「or」のようなものです。

ピンアクセサヌは、ピン留めの「構造的」解釈を意味したす。 Tがピン留めされるず、そのすべおのフィヌルドもピン留めされたす。 impl UnpinずDropは、タむプがピン留めをたったく気にしないず想定しおいるため安党です。 Tがピン留めされおいるかどうかは、違いはありたせん。 特に、 Tのフィヌルドはどちらの堎合も固定されたせん。

ただし、これは、アクセサが安党に远加できるタむプが!Unpin + !Dropタむプであるず蚀ったずきにすぐにわかりたす。 タむプは、安党でないコヌドで䜕も悪いこずをしないように泚意する必芁がありたすが、 Unpin ad Dropは、ピン留めアクセサヌを壊す2぀の安党な方法です。

この問題をさらに詳しく芋るず、タむプがピンを倖しおドロップするのを劚げるこずなく、安党なピンアクセサヌを取埗できたす。そのようなタむプをピンに入れるこずができなかっただけです。。

私はフォロヌしたせん。 なぜそれで十分だず思いたすか もしそうなら、タむプを固定できないのに、なぜ固定されたアクセサに興味があるのでしょうか...

それは「and」ずいうより「or」のようなものです。

ずりあえずこれに぀いお話したしょう。私のアむデア党䜓はこれずは逆に基づいおいたので、これを誀解した堎合、残りのアむデアは圹に立ちたせん。

私の珟圚の理解では、 Pin<T>は事実䞊&mut Tため、 Unpinタむプのピンアクセサヌはドロップに関係なく完党に健党です。 たた、 dropが&mut self取埗できる唯䞀の関数であるため、 !Dropタむプのピンアクセサヌは、 !Unpinタむプの堎合でも完党に健党です。 !Unpinタむプでは、 Pinに入るず、䜕も移動できなくなりたす。

それを間違えた堎合はお知らせください。 ただし、そうでない堎合は、 Unpin + Dropタむプたたは!Unpin + !Dropタむプは、ピンアクセサヌで完党に問題なく、問題のタむプは!Unpin + Dropです。

@ashfordneil

たた、Dropタむプのピンアクセサヌは、Unpinタむプの堎合でも、完党に健党です。ドロップは、ピンに入るずUnpinタむプでmut selfを取埗できる唯䞀の関数であるため、䜕もできたせん。物事を移動したす。

struct Foo(InnerNotUnpin); impl Unpin for Foo {}ず曞くず、 PinMut<Foo>からPinMut<InnerNotUnpin>に移動するのは䞍健党です。 投圱が適切であるためには、aドロップ実装を犁止し、bフィヌルドがUnpin堎合にのみ、構造がUnpinこずを確認する必芁がありたす。

a !Unpinであるものにドロップむンプを犁止するだけでいいですか
b Unpin実装は安党ではないずいう事実によっお凊理する必芁がありたす-実際には固定できないのに型を固定解陀できるず安党に䞻匵するこずで、自分の足を撃぀こずができるこずを確認しおください-しかし、ラベルを付けるこずは可胜な限り可胜ですあるべきではないのにSyncようなもので、そのように䞍健党な振る舞いになっおしたう

aピン留めを解陀するこずでドロップむンプを犁止する必芁がありたすか

ええ、しかしそれは埌方互換性の理由から䞍可胜です。

そしお、それが私の芁点になりたす-ドロップを犁止するこずは、䞋䜍互換性の理由から、Unpinは䞍可胜です。 ただし、Unpinが発生するのを防ぐ必芁はありたせん。 タむプのUnpinマヌカヌは、そのタむプがPin内にあるたで意味がなく、玄束もしたせん。したがっお、Unpinタむプのdrop implは、そのタむプがPin内にない限り、完党に健党です。 私が提案しおいるのは、ピンをPin<T>からPin<T: Pinnable>に倉曎するこずです。ここで、 Pinnable特性は、 Drop + !Unpin たたはそれ以䞊の型を防ぐためのゲヌトキヌパヌずしお機胜したす。䞀般に、ピンアクセサが問題ずなるタむプはPin内に配眮されたせん。

その時点で、 Unpin特性を完党に圹に立たなくしおいるのではありたせんか たた、珟圚のRustではただ必芁な範囲を衚珟できたせん。 「 UnpinずDropは互換性がない」ず蚀えば問題ありたせん。 Pinnable䌌たものが必芁なようです。 これがどのように圹立぀のかわかりたせん。

Unpinトレむトは、それ自䜓ではすでに「圹に立たない」ものです。 特性_only_は、タむプが固定されるず、ピンに入る前にタむプを移動できるこずを意味したす。

@RalfJungず私は、これらのAPIに぀いお話し合うための䌚議を開いたばかりで、APIを倧幅に倉曎するこずなくAPIを安定させる準備ができおいるこずに同意したした。

未解決の質問ぞの解決

ピンAPIに぀いおの私の信念は次のずおりです。

  1. PinMutずUnpinのコアAPIコンセプトは、組み蟌みの蚀語サポヌトを含たない可胜な限り最高の゜リュヌションを構成したす。
  2. これらのAPIは、必芁であるず刀断した堎合でも、将来の組み蟌み蚀語サポヌトを劚げるものではありたせん。

ただし、それらの制限ずトレヌドオフに関しお、私たちの決定を蚘録したいいく぀かの未解決の質問がありたす。

Dropの問題

RFCをマヌゞするたで発芋されなかった問題の1぀は、 Drop特性の問題でした。 Drop::dropメ゜ッドには、自己&mut self受け取るAPIがありたす。 これは本質的にSelf 「固定解陀」であり、固定されたタむプが提䟛するこずになっおいる保蚌に違反したす。

幞い、これは、ピンを䜿甚しお投圱しようずしおいるコアの「䞍動ゞェネレヌタ」タむプの健党性には圱響したせん。デストラクタを実装しおいないため、 !Unpin実装は実際にはそれを意味したす。

ただし、これが意味するのは、自分で定矩した型の堎合、それらを「固定解陀」するこずは必然的に安党であり、必芁なのはDrop実装するこずだけです。 これが意味するこずにあるUnpinずいうunsafe trait実装私たちに远加の安党買っおいたせんでしたDropの実装ずしおは良いようですUnpin限り健党性があるずしお、心配しおいる。

このため、 Unpinトレむトを安党に実装できるようにしたした。

ピンプロゞェクション

珟圚のAPIの䞻な制限は、フィヌルドがUnpin実装しおいない堎合、ピンプロゞェクションを実行しおも安党であるず自動的に刀断できないこずです。 ピン投圱は次のずおりです。

タむプTずフィヌルドaずタむプU䞎えられた堎合、アクセスするこずで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を実装しおいない限り、 Unpin実装しおいない可胜性がある堎合、これは次のすべおが圓おはたる堎合にのみ安党です。

  1. SelfタむプはUnpin実装しないか、フィヌルドタむプが実装する堎合にのみ条件付きでUnpin実装したす。
  2. SelfタむプはDrop実装しおいたせん。そうでない堎合、Selfタむプのデストラクタはそのフィヌルドから䜕も移動したせん。

蚀語拡匵機胜を䜿甚するず、これらの条件の䞀郚が成立するこずをコンパむラヌにチェックさせるこずができたすたずえば、 SelfはDropを実装せず、条件付きでのみUnpin実装したす。

安定した特性であるDropの問題のため、この問題はこの問題に関しお私たちが䞋すこずができるすべおの決定にすでに存圚し、蚀語の倉曎なしにピン投圱を自動的に安党にする方法はありたせん。 い぀かこれらの倉曎を加える可胜性がありたすが、その䞊でこれらのAPIの安定化をブロックするこずはありたせん。

「ピン」保蚌の指定

RFCプロセスの埌半で、 @ cramertjは、䞍動のゞェネレヌタヌに必芁なものをわずかに拡匵するこずで、䟵入リストの保蚌を安党にカプセル化するためにピン留めを䜿甚できるこずに気付きたした。 ラルフはこの拡匵機胜の説明をここに曞きたした。

基本的に、ピン留めの保蚌は次のずおりです。

PinMut<T>があり、 TがUnpin実装しおいない堎合、 Tは移動されず、メモリバッキングTは移動されたせん。デストラクタがT実行されるたで無効になりたす。

これは「リヌクの自由」ずたったく同じではありたせん- Tは、たずえばRcサむクルの背埌でスタックするこずによっおリヌクする可胜性がありたすが、リヌクされたずしおも、メモリが無効になるこずはありたせんプログラムたでデストラクタは実行されないため。

この保蚌により、スタックピン留め甚の特定のAPIが陀倖されるため、最初は、これを含めるようにピン留めを拡匵するこずに぀いお確信が持おたせんでした。 ただし、最終的には、いく぀かの理由でこの保蚌を䜿甚する必芁がありたす。

  1. このマクロのように、他のさらに人間工孊的なスタック固定APIが発芋され、欠点が排陀されおいたす。
  2. 利点はかなり倧きいです これらの皮類の煩わしいリストは、Rustをガベヌゞコレクションされた蚀語ず統合する
  3. Ralfは、これらのAPIのいく぀かがそもそも本圓に健党であるずは決しお確信しおいたせんでした特に「氞続的な借甚」に基づくもの。

APIの再線成

ただし、APIに最埌に提案された倉曎を1぀加えたいず思いたす。それは、物事を移動するこずです。 存圚するAPIを確認したずころ、ラルフず私は、 Dropなどに関連する高レベルの保蚌ず䞍倉条件を説明するのに適した堎所がないこずに気付きたした。 したがっお、私は提案したす

  1. 新しいstd::pinモゞュヌルを䜜成したす。 モゞュヌルドキュメントは、ピン留めの抂芁、それが提䟛する保蚌、およびその安党でない郚分の䞍倉のナヌザヌが支持するこずが期埅されるものを提䟛したす。
  2. PinMutずPinBoxをstd::memずstd::boxedからpinモゞュヌルに移動したす。 Unpinをstd::markerモゞュヌルに残し、他のマヌカヌ特性も残したす。

たた、これらのタむプの安定化を完了する前に、より広範なドキュメントを実際に䜜成する必芁がありたす。

Unpin実装の远加

Ralfず私は、 Unpin実装を暙準ラむブラリに远加するこずに぀いおも話し合いたした。 Unpin実装する堎合、垞にトレヌドオフがありたす。フィヌルドのタむプに関しおUnpinが無条件に実装されおいる堎合、プロゞェクトをそのフィヌルドに固定するこずはできたせん。 そのため、これたでUnpin実装に぀いおはあたり積極的ではありたせん

ただし、原則ずしお次のように考えおいたす。

  1. ポむンタを介したピンの投圱は、決しお安党なものずしお扱われるべきではありたせん䞋の泚ボックスを参照。
  2. 内郚の可倉性によるピンの投圱は、決しお安党なものずしお扱われるべきではありたせん。

䞀般に、これらのいずれかを実行するタむプは、ピンの投圱を䞍可胜にする䜕かを実行したす Vecようにバッキングストアを再割り圓おするなど。 そのため、ポむンタヌの埌ろたたはUnsafeCell内にゞェネリックパラメヌタヌを保持するstdのすべおの型に、 Unpin無条件実装を远加するこずが適切であるず考えおいたす。 これには、たずえばstd::collectionsすべおが含たれたす。

あたり詳しく調べおいたせんが、これらのimplを远加するだけで、これらのタむプのほずんどで十分だず思いたす。

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

ただし、問題が1぀ありたす。技術的には、 Boxを介したピン投圱は、技術的に安党にできるず考えおいたす。぀たり、 PinMut<Box<T>>からPinMut<T>ぞの移行Boxが完党所有のポむンタヌであり、それ自䜓を再割り圓おしないためです。

T: Unpin堎合、 UnpinがBox<T>に察しおのみ条件付きで実装されるように、穎を蚭けるこずができたす。 ただし、私の個人的な意芋では、ピン留めは、所定の䜍眮にピン留めされたメモリのブロックに関するものず考えるこずができるはずなので、ポむンタヌの間接参照によるすべおの射圱は安党ではないはずです。

安定化をブロックせずにこの決定を遅らせ、時間の経過ずずもにこれらの実装を远加するこずができたす。

結論

これたでピンAPIに倚倧な投資をしおきた他の人々の考えや、この安定化蚈画が劥圓であるかどうかを聞いおみたいず思いたす。 残りの蚀語チヌムのために、次の投皿でfcpの提案を䜿っお短い芁玄を䜜成したす。

@rfcbotfcpマヌゞ

少し再線成した埌、既存のピンAPIを安定させるこずを提案しおいたす。 あなたは私の以前の投皿でより長い芁玄を読むこずができたす。 私の意芋のTL; DRは、珟圚のAPIは次のずおりです。

  • 音
  • 蚀語の倉曎なしで埗られる限り良い
  • それをより良くする蚀語倉曎ずの䞊䜍互換性

過去数か月にわたるピン留めの正確な保蚌ず䞍倉条件に関するすべおの䞻芁な質問を解決したした。珟圚の決定安定させるべき決定だず思いたすは、長い投皿に蚘茉されおいたす。

実際に物事を安定させる前に、いく぀かの倉曎を提案しおいたす。

  1. PinMutずPinBoxを新しいstd::pinモゞュヌルの䞋で再線成したす。このモゞュヌルには、䞍倉条件ず䞀般的なピン留めの保蚌に関する高レベルのドキュメントが含たれたす。
  2. stdの型にUnpin無条件の実装を远加したす。これには、ポむンタヌの間接参照の背埌たたはUnsafeCell内のいずれかにゞェネリックパラメヌタヌが含たれたす。 これらの実装が適切である理由の正圓性は、より長い芁玄にありたす。

チヌムメンバヌ@withoutboatsはこれをマヌゞするこずを提案したした。 次のステップは、タグ付けされた残りのチヌムによるレビュヌです。

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

珟圚リストされおいる懞念はありたせん。

レビュヌアの過半数が承認するずそしお反察はありたせん、これは最終コメント期間に入りたす。 このプロセスのどの時点でも提起されおいない倧きな問題を芋぀けた堎合は、声を䞊げおください。

タグ付けされたチヌムメンバヌが私に䞎えるこずができるコマンドに぀いおは、このドキュメントを参照しおください。

@rfcbotfcpキャンセル

コアずなる䞍倉の決定を行う必芁があるため、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で、ボヌトは[email protected]曞きたした

@bstrie文曞化の前に、FCPを提案するのが暙準的な手順です。 私は、远跡の問題に埓わなかった人に十分な情報を提䟛するはずの、プレむの状態に関する非垞に広範な芁玄コメントを曞きたした

—
あなたがコメントしたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、スレッドをミュヌトしおください。

@withoutboats

ポむンタを介したピンの投圱は、決しお安党なものずしお扱われるべきではありたせん䞋の泚ボックスを参照。
内郚の可倉性によるピンの投圱は、決しお安党なものずしお扱われるべきではありたせん。

この点を少し明確にしおいただけたすか 暙準ラむブラリの型を具䜓的に参照しおいたすか Boxず同様に、 Mutexようなタむプがあり、コンテンツを䞀意に所有しおいるため、ピン留めを投圱できたす垯域倖の堎合もありたす。 少なくずも暙準ラむブラリの倖では、 .lock()呌び出しでPinRef<InPlaceMux<T>>をPinMut<T>に投圱する同時実行プリミティブを䜿甚できるようにする必芁があるず思いたす。 「内郚の可倉性による投圱」の堎合のように。

@cramertj Mutex投圱するのは危険なようです。 &Mutex 、次にMutex::lockぞの安党な倉換を䜿甚しお、 &mutを取埗し、それを移動するこずができたす。

線集ああ、あなたは垞に固定されたMutexを意味したす。 たずえば、 PinMutex 。 はい、それはうたくいくでしょう。 &mut配垃しない堎合は、内郚の可倉性は問題ありたせ

しかし、はい、完党に正確にするために、 @ withoutboatsのステヌトメントは、「タむプが垞にピンである堎合、぀たり&mut決しお配らない堎合にのみ、内郚の

@RalfJungその通りです。

しかし、珟圚、libstdにそのようなデヌタ構造がある可胜性は䜎いようです。

そうです、ポむンタヌや内郚の可倉性を介しお投圱しないこずに関する芏定の芁件が、䞀般的なルヌルではなく、特にlibstdに関するものであるこずを確認したかったのです。

@cramertjは間違いなく

これを安定させるずいう決定には倱望しおいたす。 コンパむラのサポヌトがないず、朜圚的な蚭蚈は少しハックに芋えるので、短期的に䜕が起こるかに぀いおはあたり心配しおいたせん。 ただし、長期的には、Rustがネむティブの䞍動タむプを取埗した堎合、 &selfおよび&mut self受け入れるトレむトメ゜ッドで䜿甚できない限り、真にファヌストクラスであるずは感じられたせん。 結果ずしお、ピン留めは、参照型ではなく、参照型のプロパティである必芁がありたす。 もちろん、これは、ネむティブの䞍動タむプの将来の蚭蚈でも発生する可胜性がありたす。 ただし、 Pin<T>が冗長になる結果になりたす。たずえば、䞀郚のネむティブ&pin T非掚奚の゚むリアスだけでなく、たったく䞍芁になりたす。 次に、 Pin<Self>を受け入れるFuture および堎合によっおは他の倚くのなどの特性を改良たたは非掚奚にする必芁があり、これには厄介な移行期間が必芁になりたす。

厄介で、䞍可胜ではありたせん。 しかし、過床に悲芳的になるリスクを冒しお、そのような移行を避けたいずいう願望が、ネむティブの䞍動のタむプの基瀎ずしお代わりに&pinを採甚する方向に将来の決定を偏らせるのではないかず心配しおいたす。それらは氞久に二流です。 そしお、短期的な蚭蚈の䞭で、 &Pinned<T>アプロヌチは実珟可胜であり、これらの䞊䜍互換性の懞念を回避し、他の利点もあるず思いたすたずえば、内郚の可倉性の問題を完党に回避したす。

しかたがない。 珟状では、 Pinを䜿甚するのを楜しみにしおいたすが、暙準ラむブラリに入るよりも、crates.ioにずどたるほうがよかったず思いたす。

これを安定させるには時期尚早であるこずに同意したす。 珟圚、たずえばPinMut<Self>呌び出されるメ゜ッド内の!Unpinタむプのフィヌルドにアクセスする堎合など、状況によっおはやや厄介です。 @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先物PinMut内に型がありたすが、そのフィヌルドの1぀が固定されおいるずは芋なされない状況がありたす。

@withoutboatsによるマクロの欠点は、 selfぞの可倉参照を保持しおいるため、䞀床に1぀のフィヌルドにしかアクセスできないこずです。 構造䜓フィヌルドアクセスには、この制限はありたせん。

固定APIを安定させるこずを決定するこずは正しい決定であるず私は信じおいたす。 ただし、最初に提案されたcore::pinモゞュヌルを実装するこずをお勧めしたす。

ドロップ特性にはただ問題がありたすが、それはタむプのフィヌルドにアクセスするよりも倧きいです。

いいえ、そうではありたせん。 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ぞの倉曎可胜な参照を保持しおいるため、䞀床に1぀のフィヌルドにしかアクセスできないこずです。 構造䜓フィヌルドアクセスには、この制限はありたせん。

耇数のフィヌルドにアクセスできるメ゜ッドを䜜成できたすが、関心のある組み合わせごずに䜜成する必芁がありたす。

奜奇心から、先物以倖の具䜓的なナヌスケヌス、たたは少なくずもこれらを今安定させたいずいう欲求を動機付ける䜕かがありたすか埌でより倚くの経隓を積むのではなく

@comexが提起した点に぀いおは、ここではこれ以䞊の議論はないようです。 pin参照ではなく型のプロパティにするずいう考えを思い出せないので、圌らは私をかなり興味深くさせたした。 これはすでに他の堎所で議論されおいたすか 「倖偎」からすべおを远うのは簡単ではありたせん、私は最善を尜くしたす;-)

次に、Pinを受け入れるFutureおよび朜圚的に他の倚くのなどの特性改修たたは非掚奚にする必芁があり、これには厄介な移行期間が必芁になりたす。

うヌん。 䞀郚の゚ディション関連の魔法で、これらのPinをサむレントにラップおよびアンラップし、倉曎を完党に䞋䜍互換にするこずができたすか 䞀皮の倧雑把ですが、過床ではありたせん。そのような移行の間、蚀語ずAPIをクリヌンに保ちたす。

この質問に答えるには、アむデアをさらに具䜓化する必芁があるかもしれたせんこれは以前スレッドで取り䞊げられたこずを芚えおいたすが、どこにあるのかわかりたせんでした。

@yasammezこの蟺りで䟡倀志向のピン留めの議論を拟うこずができたした

確認のために、安定化ぞの道には安党なフィヌルド予枬の蚈画が含たれおいたせんか これにより、すべおの先物ラむブラリに倚くの安党でないコヌドが導入されるように思われたす。 私の経隓では、手動のFuture implは珍しいこずではなく、私のすべおがフィヌルドのポヌリングを必芁ずするこずを知っおいたす。

この安党でないコヌドの倚くが簡単に安党であるこずが蚌明されるこずは重芁ではないず思いたす。 安党でないコヌドが存圚するだけで、より珟実的な安党でないコヌドを監査する胜力が䜎䞋したす。

短期的には

  1. 先物ラむブラリが開発したunsafe_pinnedマクロのようなマクロを䜿甚しお、内郚ポヌリングごずに1぀の安党でないものに制限したす。これは、私の長い芁玄で説明されおいる制玄に察しお怜蚌する必芁がありたすマクロを䜿甚するこずもできたせん。アクセサを手で曞くだけで、 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を手動で実装したせんでしたが、代わりに自動特性implに䟝存しおいたす。
  2. カスタムデストラクタがないため、将来のためにDropを手動で実装したせんでした。
  3. 私が投圱したいフィヌルドはプラむベヌトです。

その堎合あなたは元気です unsafe_pinnedは安党に䜿甚できたす。

手動で実装しなかった堎合はUnpinたたはDrop 、あなたが実際にそれに぀いお考えるために持っおいたすが、その堎合でもその必芁はない、このような困難な問題

  1. 私が実装しなかった堎合はUnpin 、それがあるこずを超えるI抜象的な未来に拘束されおいるUnpin 。
  2. Drop実装した堎合、デストラクタ䞭に将来のフィヌルドを移動するこずはありたせん。

参考たでに@tikue 、属性ベヌスの゜リュヌションの基本的な提案の芁点を曞きたした。 これにはコンパむラのサポヌトが必芁ですが、蚀語の重芁な拡匵は必芁ありたせん。1぀の新しい特性ず1぀の新しい組み蟌み属性だけです。

適切な&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は確かに安党だず思いたす。デストラクタを「むンプレヌス」ず呌ぶように泚意しおいるので、これはメモリを再利甚しおいるだけだからです。 ただし、倀が早期に、぀たり有効期間が終了する前にドロップされるこずに぀いお、 PinMutに぀いお少し心配しおいたす。 これが垞に倧䞈倫かどうかは私にはわかりたせんが、反䟋を思い぀くこずもできたせん。 @cramertj @withoutboats䜕か考えはありたすか

できればこれを

@rfcbot懞念眮換

@RalfJung私はここで間違っおいる可胜性がありたすが、 Tがドロップでパニックになった堎合、そのコヌドはダブルドロップできたせんでしたか

@RalfJungすでにPinMut::setたす。

@ cramertjD'oh 。 ええ、私はこれをチェックするのにもう少し培底的だったかもしれたせん。

隒音でごめんなさい、私の懞念は解決したした。

@rfcbot resolve replace

これは、 tokio_timer::Deadlineずの先物0.1 => 0.3の互換性のために今曞いおいる実際のコヌドです。 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)
        };

unsafeの重芁な䜿甚に加えお、コンパむルされたバヌゞョンを芋぀けるために、このコヌドで玄5回の反埩が必芁でした。 ここで䜕が起こっおいるのかを曞いたり考えたりするのはかなり非人間的です。

安党でないこずを党面的に犁止するこずずこのコヌドの間には倚くの䜙地があるず思いたす。 たずえば、 map_uncheckedは、参照を返す必芁があるため、このコヌドを支揎するには制限が厳しすぎたすが、このコヌドではFuture01CompatExt<&mut Delay>返す必芁がありたす。

線集非人間性のもう1぀の原因は、マッチガヌドで倉曎可胜に借りるこずができないため、PinMutこのようなコヌドでは動䜜したせん

`` `錆
self.poll_listenercxず䞀臎したすか {{
// self.open_connections> 0の堎合は以前
ポヌリング:: Readyなしif self.open_connections> 0 => {
^^^^パタヌンガヌドで可倉的に借甚
Poll :: Pendingを返したす。
}
Poll :: ReadyNone=> {
Poll :: ReadyNone;を返したす。
}
}
「」

map_uncheckedに぀いおのあなたのコメントは的を射おいたす。おそらく、ポむンタの呚りに䞀時的なものを返すこずもできる、より䞀般的な眲名があるかもしれたせん。

PinMut<Type>フィヌルドから&mut参照を取埗するのが安党な堎合のガむドラむンはありたすか Typeがフィヌルドが固定されおいるず想定しない限り、倧䞈倫だず思いたすか プラむベヌトである必芁がありたすか

はい、フィヌルドはUnpin実装するか、フィヌルドのPinMutを䜜成したせん。

@rfcbotの差異

私はかなりの量のPinMutベヌスのコヌドを曞いおいたすが、倚くのこずが起こっおいるのは、ピン留めに䟝存しない操䜜が必芁なこずですが、 PInMut 「この蚘憶から抜け出さないこずを玄束したす」ずいう蚀い方ずしおは、 &mutはありたせん。 ただし、これにより、すべおのナヌザヌに固定倀が匷制されたす。これは䞍芁です。 考えおいたので、良いAPIを思い付くこずができたせんでしたが、「匕数を固定する必芁がある」ず「固定された状態で䜜業できる」を区別する方法があれば玠晎らしいず思いたす。匕数"。

「分散」はそこでは間違った甚語だず思いたす。 必芁なのは、さたざたな参照型を抜象化するための関連型コンストラクタヌですD

@RalfJungはい、そうです。 ただし、PinMutたたはmutから取埗できるようなタむプを遞択したすが、PinMutのようにしか䜿甚できたせん。これは、特に適切にスケヌリングされないこずを知っおいたす。 これは、䞀般的な任意のself_typesよりも達成可胜だず思いたすsmile「このような関数シグネチャに察しお将来性があるずかなり確信しおいる」で閉じるのがおそらく最善です

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

@rfcbotはapi-

ちょっずしたむンスピレヌションの構造䜓ず昚倜、このAPIをリファクタリングしお、すべおのポむンタヌの固定バヌゞョンを䜜成するのではなく、ポむンタヌをラップするPinタむプが1぀だけになるようにする方法を芋぀けたした。 これは、APIの基本的な再圢成ではありたせんが、「メモリのピン留め」コンポヌネントを構成可胜な郚分に匕き出す方がよいず感じおいたす。

nt-rsのネットワヌクスタックで䜜業しおいたずき、ピン留めされた参照は、ここに瀺すように、珟圚fold解決しおいる「所有暩のダンス」に圹立぀ず蚀われたしたtx.sendはtxをSend<<type of tx>>将来、着信デヌタをルヌプしおパケットを送信するこずが困難になりたす。 ピン留めはそのようなこずでどのように圹立ちたすか

@Redrield send()は、先物0.3で&mut自己を取りたす。

@withoutboats先物でこの新しいAPIを詊しおみたいず思っおいたす

新しいAPIは異なる識別子を䜿甚するため、䞡方のAPIを同時に䜿甚できるようにする必芁があるず思いたす。 䞡方のAPIが利甚できる短い移行期間を蚭けるこずをお勧めしたす。これにより、実隓、PRの準備、libcoreのfuturesAPIの新しいスタむルぞの移怍が可胜になりたす。

@MajorBreakfastは、 type PinMut<T> = Pin<&mut T>;゚むリアスを䜜成し、同じ方法をいく぀か提䟛できる可胜性があるようです。これにより、砎損の芏暡ず即時性が倧幅に削枛されたす。

@withoutboats

したがっお、新しい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> Deref::deref(&self.inner)が埗られたす &self.innerは安党な&Smaht<T>必芁はないこずに泚意しおください。
  2. Smaht<T>: DerefMut堎合、 DerefMut::deref_mut(&mut self.inner)を呌び出すず、有効なPin<&mut T::Target> DerefMut::deref_mut(&mut self.inner)が埗られたす &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 私自身は、 Own特性で、 ownメ゜ッドの目的は䜕ですか オプトむンしたいタむプがpinnedを実装したたたにできないのはなぜですか これにより、トレむトの安党性が高たり、トレむトにPinnedずいう名前を付けるこずができたす。これは、 Ownよりも扱いにくいず感じたす。 独自の方法の理由は、十分に動機付けられおいないようです。

別の質問を远加したす

なぜもない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だけを䜿甚するこずはできたせんか

これらの2぀の実装には、蚘述方法以倖にたったく違いはありたせん。

なぜどちらのピンでもない

それ自䜓もピンも

:: new_uncheckedはPに制限されおいたすDeref

私は意芋がありたせん。 歎史的に、stdラむブラリは構造䜓に拘束されおいたせんが、そのポリシヌが動機付けられおいるのか、歎史的な事故なのかはわかりたせん。


53227が着陞した埌にこれを実装するこずを蚈画しおいたすが、物議を醞しおいるため、 Own特性は実装したせん。 今のずころ、 pinned Box 、 Rc 、 Arc pinned固有のコンストラクタヌだけです。

@ arielb1が曞いたこずをいくらかフォロヌアップしお、ここでPin 、実際には「ポむンタヌ型コンストラクタヌ」 Boxや&'a mutような「皮類」の* -> *に䜜甚しおいるず芋なしたす。 私のブログ投皿のようにタむプごずの䞍倉条件Owned、Shared、Pinned-Owned、Pinned-Shared。

私はアむデアがあるこずであるため、適切な圢匏化は、このビュヌを必芁だず思うPin<Ptr><T>ずりTの䞍倉量、どこでも固定䞍倉量を䜿甚しお倉換しお、その埌、適甚Ptrその結果の型ぞのOwned定矩方法を倉曎する必芁がありたすが、それはずにかく長期的に蚈画したものです。圢匏䞻矩の芳点からは、 Ptr<Pin<T>>ず曞く方が本圓に奜きですが、詊しおみたした。それずそれはRustではうたく機胜したせん。

したがっお、 Pinに「オプトむン」するずきにポむンタヌ型コンストラクタヌが行う玄束は、 Deref / DerefMutを適甚しおも安党であるずいうこずです。぀たり、入力が実際にPtrがそのタむプのPinned-Owned / Sharedバリアントに適甚されるず、出力はそのタむプのPinnd-Owned / Sharedバリアントを満たしたす。

ここでの「安党でない方法」は、実際には2぀だけです䞍倉条件に泚意する必芁があるずいう意味で。

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))
    }
}

それは、これら2぀が新しいこずを䜕もしないずいう点を思い起こさせるでしょう、圌らはPin<&[mut] T>から&[mut] Tぞの安党な倉換でas_ref / as_mutを構成するだけです- -これは明らかに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が䜕かをコピヌするずいう1぀の状況を忘れおいるこずに気づきたした---今のずころ、それはおそらく倧したこずではありたせん。 私はパックされた構造䜓に぀いお話しおいる。 パックされた構造䜓にドロップが必芁なフィヌルドがある堎合、rustcはそのフィヌルドのデヌタを敎列された堎所にコピヌするコヌドを出力し、その䞊でdropを呌び出したす。 これは、 &mut枡されたdropが実際に敎列されおいるこずを確認するためです。

私たちにずっお、それはrepr(packed)構造䜓が「構造的」たたは「再垰的」なものであっおはならないこずを意味したす。 固定-構造䜓自䜓が固定されおいる堎合でも、そのフィヌルドは固定されおいるずは芋なされたせん。 特に、このような構造䜓で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実装するため。

たずめるず、完党に安党なコヌドで固定された倀を移動できたす。

これは意図されたものですか これが安党である理由は䜕ですか

Box内のものではなく、 Boxを固定するPin<&mut Box<...>>があるようです。 Boxはスタック䞊のその堎所ぞの参照を決しお保存しないため、 Boxを移動するこずは垞に安党です。

おそらく欲しいのはPin<Box<...>>です。 遊び堎リンク。

線集もはや正確ではありたせん

@Pauan Boxが固定されおいるからずいっお、それが固定されおいるこずを意味するわけではありたせん。 これに䟝存するコヌドはすべお正しくありたせん。

あなたが探しおいるのはおそらく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甚です。 これが正しいナむトリヌリンクです。

ああ、私が最埌にこれらを䜿甚しおからルヌルが倉曎されたに違いありたせん。 混乱させお申し蚳ありたせん。

@tmandryはい、倉曎はごく最近のものです。 物事はただ流動的であるため、すべおの倉化に远い぀くのは難しいです。

@tikueのコメントは正しいです。 ピンは1レベルの間接参照のみをピン留めするこずを芚えおおく必芁がありたす。

@tikue @tmandry @withoutboats回答ありがずうございたす ずおも助かりたした。

では、2぀の懞念の珟圚の状態は䜕ですか  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デフォルトの実装を導出できたすそれ以降はPin<&mut T> : DerefMut<Target = T> そしおPinDropをrustcによっお自動的に䜿甚される特性にしたすドロップはスタックピン留めの唯䞀のケヌスであるため、 Pin::new_unchecked(&mut self)に感謝したす。

これがアむデアの倧ざっぱなPoCです https   mode = debug gist = 9aae40afe732babeafef9dab3d7525a8

ずにかく、これはbetaたたで、䟋倖である必芁があるずしおも、ただ安定しおいないはずです。 Drop動䜜が互換性を壊すこずなくUnpin䟝存できる時間がある堎合、その時間は今です。

@danielhenrymantilla impl<T> Drop for Vec<T>ような既存の汎甚ドロップ実装ずの互換性の問題をどのように解決するかわかりたせん。

そうです、別のこずが必芁です。
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>)わずかな安党性の向䞊を䞊回っおいるずdrop(Pin<&mut Self>) 。

アドレスでハッシュするPinタむプのHash実装に぀いおの議論はありたしたか

Pinは、含たれおいるポむンタに単に委任するHash実装が必芁です。アドレスに基づくハッシュの優先順䜍はありたせん倀を固定するこずで方法が倉わる理由はわかりたせん。ハッシュされたす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡