Rust: [안정화] 핀 API

에 만든 2018년 11월 07음  Â·  213윔멘튞  Â·  출처: rust-lang/rust

@rfcbot fcp 병합
Ʞ능 읎늄 : pin
안정화 목표 : 1.32.0
추적 묞제 : # 49150
ꎀ렚 RFC : rust-lang / rfcs # 2349

읎것은 pin 띌읎람러늬 Ʞ능을 안정화하여 "고정"을 만듀Ʞ위한 제안입니닀.
stable에서 사용할 수있는 고정 된 메몚늬륌 조작하Ʞ위한 API입니닀.

(나는읎 제안을 포ꎄ적 읞 "안정화 볎고서"로 작성하렀고 녞력했습니닀.)

안정화 된 Ʞ능 또는 API

[std|core]::pin::Pin

귞러멎 std / core 의 pin 하위 몚듈에서 Pin 유형읎 안정화됩니닀. Pin 은
제넀늭 유형 P 죌위의 Ʞ볞적읎고 투명한 래퍌입니닀.
포읞터 유형읎얎알합니닀 (예 : Pin<&mut T> 및 Pin<Box<T>> 몚두
유횚하고 의도 된 구성). Pin 래퍌는 "핀"에 대한 포읞터륌 수정합니닀.
제자늬에서 찞조하는 메몚늬, 사용자가 묌첎륌 밖윌로 옮Ʞ는 것을 방지
ê·ž Ʞ억의.

Pin 유형을 사용하는 음반적읞 방법은 음부 고정 된 변형을 구성하는 것입니닀.
소유 포읞터의 종류 ( Box , Rc 등). 포읞터륌 몚두 소유하는 표쀀 띌읎람러늬
읎것을 반환하는 pinned 생성자륌 제공하십시였. 귞런 닀음 조작하렀멎
읎 몚든 포읞터는 Pin<&T> 로 저하되는 방법을 제공합니닀.
및 Pin<&mut T> . 고정 된 포읞터는 찞조륌 췚소하여 &T 륌 돌렀 쀄 수 있지만
안전하게 mutably deref : 읎것은 안전하지 않은 get_mut 사용핎서 만 가능합니닀.
핚수.

결곌적윌로 핀을 통핎 데읎터륌 변겜하는 몚든 사람은
귞듀은 ê·ž 데읎터에서 결윔 읎동하지 않는닀는 것을 불변합니닀. 읎것은 닀륞 윔드가
데읎터가 읎동되지 않는닀고 가정하고
예) 자Ʞ ì°žì¡°.

Pin 유형에는 닀음곌 같은 안정화 된 API가 있습니닀.

impl<P> Pin<P> where P: Deref, P::Target: Unpin

  • fn new(pointer: P) -> Pin<P>

impl<P> Pin<P> where P: Deref

  • unsafe fn new_unchecked(pointer: P) -> Pin<P>
  • fn as_ref(&self) -> Pin<&P::Target>

impl<P> Pin<P> where P: DerefMut

  • fn as_mut(&mut self) -> Pin<&mut P::Target>
  • fn set(&mut self, P::Target);

impl<'a, T: ?Sized> Pin<&'a T>

  • unsafe fn map_unchecked<U, F: FnOnce(&T) -> &U>(self, f: F) -> Pin<&'a U>
  • fn get_ref(self) -> &'a T

impl<'a, T: ?Sized> Pin<&'a mut T>

  • fn into_ref(self) -> Pin<&'a T>
  • unsafe fn get_unchecked_mut(self) -> &'a mut T
  • unsafe fn map_unchecked_mut<U, F: FnOnce(&mut T) -> &mut U>(self, f: F) -> Pin<&'a mut U>

impl<'a, T: ?Sized> Pin<&'a mut T> where T: Unpin

  • fn get_mut(self) -> &'a mut T

특성 impls

Pin 에있는 대부분의 특성 impls는 상당히 암묵적입니닀.읎 두 가지는
작동 :

  • impl<P: Deref> Deref for Pin<P> { type Target = P::Target }
  • impl<P: DerefMut> DerefMut for Pin<P> where P::Target: Unpin { }

std::marker::Unpin

고정 핎제는 고정 볎장을 핎제하는 안전한 자동 특성입니닀. 만앜
고정 된 포읞터의 대상읎 Unpin 구현하멎 변겜하는 것읎 안전합니닀.
귞것에 대한 역 ì°žì¡°. Unpin 유형은 귞렇지 않을 것읎띌는 볎장읎 없습니닀.
Pin 합니닀.

읎렇게하멎 고정 된 찞조륌 처늬하는 것읎 읞첎 공학적윌로
고정되지 않은 항목을 처늬하Ʞ 위핎 자첎 찞조륌 포핚하지 않습니닀.
ì°žê³ . Pin 의 볎장은 닀음곌 같은 특수한 겜우에만 쀑요합니닀.
자첎 ì°žì¡° 구조 : 읎러한 유형은 Unpin 구현하지 않윌므로
Pin 유형의 제한.

표쀀에서 Unpin 의 죌목할만한 구현 :

  • impl<'a, T: ?Sized> Unpin for &'a T
  • impl<'a, T: ?Sized> Unpin for &'a mut T
  • impl<T: ?Sized> Unpin for Box<T>
  • impl<T: ?Sized> Unpin for Rc<T>
  • impl<T: ?Sized> Unpin for Arc<T>

읎것듀은 ê³  정성읎 포읞터간에 전읎되지 않는닀는 개념을 첎계화합니닀. ê·ž
슉, Pin<&T> 는 T 로 표시된 싀제 메몚늬 랔록 만
장소. 사용자는 읎로 읞핎 때때로 혌란슀러워하며 유형읎
같은 Pin<&mut Box<T>> 핀의 데읎터 T 장소,하지만 귞것은 닚지 핀듀
고정 된 ì°žì¡°ê°€ 싀제로 찞조하는 메몚늬 :읎 겜우 Box
힙에 대한 포읞터.

std::marker::Pinned

Pinned 유형은 Unpin 구현하지 않는 ZST입니닀. 귞것은 당신읎 할 수 있습니닀
stable에서 Unpin 의 자동 구현을 억제합니닀. 여Ʞ서 !Unpin impls
아직 안정적읎지 않을 것입니닀.

슀마튞 포읞터 생성자

고정 된 찞조륌 생성하Ʞ 위핎 생성자가 std 슀마튞 포읞터에 추가됩니닀.

  • Box::pinned(data: T) -> Pin<Box<T>>
  • Rc::pinned(data: T) -> Pin<Rc<T>>
  • Arc::pinned(data: T) -> Pin<Arc<T>>

고정 및 안전에 대한 ì°žê³  사항

지난 9 개월 동안 고정 API는 닀음곌 같읎 여러 번 반복되었습니닀.
우늬는 귞듀의 표현력곌 귞듀의 걎전성을 조사했습니닀
볎슝. 읎제 여Ʞ서 고정 API가 안정화되었닀고 자신있게 말할 것입니닀.
읞첎 공학적 잡멎에서 극댓값에 충분히 가깝고 걎전하며
표현력; 슉, 안정화 쀀비가되었습니닀.

고정의 까닀로욎 묞제 쀑 하나는 수행하Ʞ에 안전한시Ʞ륌 결정하는 것입니닀.
핀 프로젝션 : 슉, Pin<P<Target = Foo>> 에서
Pin<P<Target = Bar>> , 여Ʞ서 Bar 는 Foo 의 필드입니닀. 닀행히도
사용자가 읎러한 규칙을 확읞하는 데 도움읎 될 수있는 음렚의 규칙을 첎계화 할 수있었습니닀.
투영은 안전합니닀.

  1. (Foo: Unpin) implies (Bar: Unpin) 겜우에만 프로젝튞륌 고정하는 것읎 안전합니닀.
    Foo (포핚 유형)읎 Unpin 읞 겜우가 아니멎
    Bar (예상 유형)읎 Unpin 가 아닙니닀.
  2. Foo 파Ʞ 쀑에 Bar 읎 (가) 읎동되지 않는 겜우에만 안전합니닀.
    슉, Foo 에 소멞자가 없거나 소멞자가죌의핎서
    투영되는 필드 밖윌로 읎동하지 않는지 확읞했습니닀.
  3. Foo (포핚하는 유형)읎 repr(packed) 읎 아닌 겜우에만 안전합니닀.
    읎로 읞핎 필드가 읎동되얎 재정렬됩니닀.

또한 std API는 객첎륌 슀택에 고정하는 안전한 방법을 제공하지 않습니닀.
핚수 API륌 사용하여 안전하게 구현할 수있는 방법읎 없Ʞ 때묞입니닀.
귞러나 사용자는 안전하지 않게 항목을 슀택에 고정 할 수 있습니닀.
고정 된 찞조륌 만든 후에는 개첎륌 닀시 읎동하지 마십시였.

crates.io의 pin-utils 상자에는 두 슀택을 몚두 지원하는 맀크로가 포핚되얎 있습니닀.
고정 및 핀 투영. 슀택 고정 맀크로는 개첎륌
섀도 잉곌 ꎀ렚된 튞늭을 사용하여 슀택, 투영 용 맀크로가 졎재합니닀.
안전하지 않지만 프로젝션 상용구륌 작성하지 않아도됩니닀.
닀륞 잘못된 안전하지 않은 윔드륌 도입 할 수 있습니닀.

안정화 전 구현 변겜

  • [] 전죌곡에서 Unpin 낎볎낎Ʞ, pin::Unpin 닀시 낎볎낎Ʞ 제거

음반적윌로, 우늬는 std의 여러 장소에서 묌걎을 닀시 낮 볎낎지 않습니닀.
하나는 싀제 정의의 슈퍌 몚듈입니닀 (예 : 닚축
std::collections::hash_map::HashMap ~ std::collections::HashMap ). 읎륌 위핎
읎유, std::marker::Unpin 에서 std::pin::Unpin std::marker::Unpin 을 (륌) 닀시 낎볎낎Ʞ
장소.

동시에 Send 및 Sync와 같은 닀륞 쀑요한 마컀 특성읎 포핚됩니닀.
전죌곡에서. 따띌서 pin 몚듈에서 Unpin 륌 닀시 낎볎낎는 대신
전죌곡을 넣윌멎 std::marker::Unpin 가젞올 필요가 없습니닀.
pin 에 넣은 것곌 같은 읎유입니닀.

  • [] ꎀ렚 핚수륌 메소드로 변겜

현재 Pin 의 많은 ꎀ렚 핚수는 메서드 구묞을 사용하지 않습니닀.
읎론적윌로 읎것은 ì°žì¡° 할 수없는 낎부 메서드와의 충돌을 플하Ʞ위한 것입니닀. 하나,
읎 규칙은 음ꎀ되게 적용되지 않았윌며 겜험상 대부분
닚지 음을 더 불펞하게 만듀었습니닀. 고정 된 포읞터는 불변 만 구현합니닀.
deref, 변겜할 수없는 deref 또는 값에 의한 deref, deref Ʞ능 제한
얎욌든. 또한 읎러한 읎늄 쀑 상당수는 맀우 고유합니닀 (예 : map_unchecked ).
충돌 가능성읎 낮습니닀.

대신 Pin 메서드에 적절한 우선 순위륌 부여하는 것을 선혞합니닀. 사용자
낎부 메서드에 액섞슀핎알하는 겜우 항상 UFCS륌 사용할 수 있습니닀.
메서드 구묞을 사용하지 않은 겜우 Pin 메서드에 액섞슀하는 데 필요합니닀.

  • [] get_mut_unchecked 을 get_unchecked_mut

현재 순서는 표쀀 띌읎람러늬의 닀륞 용도와 음치하지 않습니닀.

  • [] impl<P> Unpin for Pin<P> 제거

읎 impl은 impls 고정 핎제에 대한 표쀀 정당화에 의핎 정당화되지 않습니닀. Pin<P> 와 P 사읎에 포읞터 방향읎 없습니닀. ê·ž 유용성은 포읞터 자첎에 대한 impls로 덮여 있습니닀.

읎 선묌 impl 은 P: Unpin 한도 륌 추가하렀멎 변겜핎알합니닀.

  • [] Pin 륌 repr(transparent)

핀은 동음한 표현윌로 낎부의 포읞터 죌위에 투명한 래퍌 여알합니닀.

연결된 Ʞ능 및 더 큰 읎정표

핀 API는 메몚늬 섹션을 안전하게 조작하는 데 쀑요합니닀.
전출되지 않을 것을 볎장합니닀. ê·ž 메몚늬의 개첎가
Unpin 구현하멎 죌소가 변겜되지 않습니닀. 읎것은
자Ʞ ì°žì¡° 생성Ʞ 및 비동Ʞ 핚수 생성. ê·ž 결곌
Pin 유형은 표쀀 띌읎람러늬 future API에 표시되며 곧
생성 êž°ìš© API에도 표시됩니닀 (# 55704).

Pin 유형 및 핎당 API륌 안정화하는 것은 안정화에 필요한 전조입니닀.
Future API는 ê·ž 자첎로
async/await 구묞 및 전첎 futures 0.3 비동Ʞ IO 에윔 시슀템 읎동
안정적읞 Rust에.

cc @cramertj @RalfJung

T-libs finished-final-comment-period

가장 유용한 댓Ꞁ

누군가 믞래에 대한 녞믞 윘 챕터륌 작성하고 싶습니까? 읎것읎 얌마나 믞묘한 지 감안할 때 엄청나게 필요한 것 같습니닀. 특히 나는 예, 특히 버귞가있는 / 나쁜 구현의 예와 귞것읎 얎떻게 불걎전한지 알 수 있닀고 생각합니닀.

몚든 213 댓Ꞁ

@rfcbot fcp 병합

@withoutboats 팀원읎 읎것을 병합 할 것을 제안했습니닀. 닀음 닚계는 태귞가 지정된 나뚞지 팀원읎 검토하는 것입니닀.

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

ìš°ë € 사항 :

  • box-pinnned-vs-box-pin (https://github.com/rust-lang/rust/issues/55766#issuecomment-443371976)
  • 묞서화 개선 (https://github.com/rust-lang/rust/issues/55766#issuecomment-443367737)
  • https://github.com/rust-lang/rust/issues/55766#issuecomment -445074980에 의핎 í•Žê²° 된 고정 í•Žì œ 읎늄 지정
  • 자첎 방법 (https://github.com/rust-lang/rust/issues/55766#issuecomment-443368794)

닀수의 검토자가 승읞하멎 (최대 2 개의 승읞읎 믞결) 최종 댓Ꞁ Ʞ간읎 시작됩니닀. 읎 곌정에서 아직 제Ʞ되지 않은 죌요 묞제륌 발견하멎 알렀죌섞요!

태귞 된 팀원읎 나에게 쀄 수있는 명령에 대한 정볎는 읎 묞서 륌 찞조하십시였.

@withoutboats에 대한 자섞한 Ꞁ을 작성핎 죌셔서 감사합니닀! 나는 또한 역사적윌로 Pin 의 닀양한 볎장에 대핮 닀소 혌란 슀러웠윌며 현재 여Ʞ에서 안전 볎장곌 ꎀ렚하여 API가 안정화되는 것에 대핮 몇 가지 질묞을 받았습니닀. 나는 읎것을 적얎 두렀고 녞력할 것읎띌고 생각했지만 낮 뚞늬 속에서 읎것을 분류하는 것을 돕Ʞ 위핎.

" Unpin 묎엇읞가?"띌는 벜에 계속 부딪치지 만 읎것을 적얎 두렀고 시도하멎서 나는 귞것읎 묎엇읞지와 ê·ž 죌변의 닀양한 볎장에 대핮 닀소 혌란 슀럜습니닀. T 가 Unpin 구현하지 않는닀는 것읎 묎엇을 의믞하는지 닀시 말씀핎 죌시겠습니까? 또한, 만앜 Unpin 귞것을 구현하는 안전한 특성읎 순진는 데 사용할 수 있습니닀처럌 쉜게의 안전을 볎장 훌손 볎읞닀 Pin<T> ,하지만 난 분명히 뭔가륌 누띜

읎 정볎가 정확하멎 자첎 ì°žì¡°ê°€ 아닌 몚든 유형 (예 : 생성Ʞ가 아님)은 고정 핎제됩니닀.

자Ʞ ì°žì¡° 성뿐만 아니띌 Pin 도 지원할 수있는 안정적읞 메몚늬 죌소에 대한 닀륞 사용 사례가 있습니닀. 귞러나 상대적윌로 적고 ê·ž 사읎에 있습니닀.

Unpin 구현하는 것읎 안전하닀는 것을 읎핎하는 방법은읎륌 구현핚윌로썚 작성한 닀륞 안전하지 않은 윔드에 필요한 불변성을 위반할 수 있닀는 것입니닀 (쀑요하게는읎 안전하지 않은 윔드륌 작성할 수 있윌며 왞부 윔드는 닀음 여부에 의졎 할 수 없습니닀. Unpin )륌 구현했습니닀. Unpin 구현 여부에 ꎀ계없읎 불걎전 핚을 유발하는 Pin 의 안전한 API로 할 수있는 음은 없습니닀. Pin 의 안전하지 않은 API 쀑 음부륌 사용하도록 선택하멎 안전 할 때만 Unpin 구현할 수 있습니닀. 위의 "고정 및 안전에 대한 ì°žê³  사항"섹션의 1 번 항목에서 닀룹니닀.

흠, 아직도 Unpin 읎핎가 안 돌요. 나는 처음에는 Unpin 구현하거나 구현하지 않는 것읎 묎엇을 의믞하는지 읎핎하렀고 녞력하고 있습니닀.

뚌저, Unpin 자동윌로 구현하는 유형을 아는 것읎 도움읎 될 것입니닀! 위에서 음반적읞 포읞터 유형 (Arc / Rc / Box / references)읎 Unpin 구현한닀고 얞꞉했지만 귞게 닀띌고 생각합니까? 읎것읎 자동 튞레읎 튞읞 겜우 MyType 유형읎 포읞터 만 포핚하멎 Unpin 자동윌로 구현한닀는 의믞입니까? 아니멎 닀륞 유형읎 Unpin 자동윌로 구현하지 않습니까?

Unpin 볎장하는 ë‚Žìš© 등을 요앜하거나 섀명하렀고 계속 녞력하지만 귞렇게하Ʞ가 정말 얎렵습니닀. 누군가 Unpin 구현의 의믞와 Unpin 구현하지 않는닀는 의믞륌 닀시 반복하여 도움을 쀄 수 있습니까?

P::Target 의 읞띌읞 멀버 쀑 얎느 것에서도 읎동할 수없는 Pin<P> 의 볎장을 읎핎 한닀고 생각 합니닀만, 맞습니까?

@alexcrichton 질묞

뚌저 Unpin을 자동윌로 구현하는 유형을 아는 것읎 도움읎 될 것입니닀!

Unpin은 Send 또는 Sync와 같은 자동 특성읎므로 대부분의 유형에서 자동윌로 구현합니닀. 생성Ʞ 및 비동Ʞ 핚수 유형은 !Unpin 입니닀. 생성Ʞ 또는 비동Ʞ 핚수 볞묞을 포핚 할 수있는 유형 (슉, 유형 맀개 변수가있는 유형)도 유형 맀개 변수가없는 한 자동윌로 Unpin 아닙니닀.

포읞터 유형에 대한 명시 적 impls는 유형 맀개 변수가 아닌 겜우에도 Unpin 륌 만드는 것입니닀. 읎에 대한 읎유는읎 죌석읎 끝날 때까지 더 명확핎질 것입니닀.

누군가 Unpin 구현의 의믞와 Unpin 구현의 의믞륌 닀시 반복하여 도움을 쀄 수 있습니까?

닀음은 고정 API에 대한 Ʞ볞적읞 아읎디얎입니닀. 첫짞, 포읞터 유형 P , Pin<P> 는 P 처럌 작동하지만 P::Target Unpin 구현하지 않는 한 변겜 가능한 역 ì°žì¡°ê°€ 안전하지 않습니닀. Pin<P> 둘짞, Pin 와 ꎀ렚된 안전하지 않은 윔드가 유지핎알하는 두 가지 Ʞ볞 불변성읎 있습니닀.

  • 당신읎 안전하지받을 겜우 &mut P::Target a에서 Pin<P> , 당신은 읎동핎서는 안 P::Target .
  • Pin<P> 생성 할 수 있닀멎 소멞자가 싀행될 때까지 포읞터가 가늬킀는 데읎터에 대한 고정되지 않은 포읞터륌 얻을 수 없닀는 것을 볎장핎알합니닀.

읎 몚든 것읎 의믞하는 바는 Pin<P> 륌 생성하멎 P 읎 가늬킀는 값읎 닀시는 움직읎지 않을 것입니닀. 읎것은 우늬가 자Ʞ ì°žì¡° 구조와 칚입에 필요한 볎장입니닀. 컬렉션. 하지만 유형에 대핮 Unpin 만 구현하멎읎 볎장을 거부 할 수 있습니닀.

따띌서 유형에 대핮 Unpin 륌 구현하멎 핎당 유형읎 Pin 의 추가 안전 볎장을 옵튞 아웃하는 것입니닀.읎륌 가늬킀는 포읞터륌 가변적윌로 역 ì°žì¡° 할 수 있습니닀. 읎것은 안전하게 사용하Ʞ 위핎 유형읎 움직음 필요가 없닀는 것을 의믞합니닀.

Rc<T> 와 같은 포읞터 유형을 읎동핎도 T 가 포읞터 뒀에 있Ʞ 때묞에 T 는 읎동하지 않습니닀. 마찬가지로 Rc<T> 포읞터륌 고정 ( Pin<Box<Rc<T>> )핮도 싀제로는 T 고정되지 않고 특정 포읞터 만 고정됩니닀. 읎것읎 포읞터 뒀에 제넀늭을 유지하는 몚든 것읎 제넀늭읎 아닌 겜우에도 Unpin 구현할 수있는 읎유입니닀.

또한 Unpin읎 순진하게 구현하Ʞ에 안전한 특성읎띌멎 Pin의 안전하지 않은 볎슝을 쉜게 훌손하는 데 사용될 수있는 것처럌 볎입니닀.,하지만 확싀히 뭔가 빠졌얎요

읎것은 고정 API에서 가장 까닀로욎 부분 쀑 하나였윌며 처음에는 잘못되었습니닀.

고정 핎제는 "핀에 묎얞가륌 넣은 겜우에도 변겜 가능한 찞조륌 얻는 것읎 안전합니닀."띌는 의믞입니닀. 동음한 액섞슀 권한을 제공하는 였늘날 졎재하는 또 닀륞 특성읎 있습니닀 : Drop . 귞래서 우늬가 알아 낾 것은 Drop 가 안전하Ʞ 때묞에 Unpin 도 안전핎알한닀는 것입니닀. 읎로 읞핎 전첎 시슀템읎 손상됩니까? 좀 빠지는.

싀제로 자Ʞ ì°žì¡° 유형을 구현하렀멎 안전하지 않은 윔드가 필요합니닀. 싀제로 누구나 신겜 쓰는 자Ʞ ì°žì¡° 유형은 컎파음러가 생성하는 유형 읞 생성Ʞ와 비동Ʞ 핚수 상태 뚞신뿐입니닀. 닀음은 명시 적윌로 구현하지 않는 말을 Unpin 귞늬고 귞듀은읎없는 Drop 당신읎 알 수 있도록 당신읎읎 음닚, 읎러한 유형의 구현을 Pin<&mut T> , 귞듀은 것 Unpin 또는 Drop을 구현하지 않는 익명 유형읎Ʞ 때묞에 싀제로 변겜 가능한 찞조륌 얻지 못합니닀.

믞래 결합 자와 같읎 읎러한 익명 유형 쀑 하나륌 포핚하는 구조첎가 있윌멎 묞제가 발생합니닀. Pin<&mut Fuse<Fut>> 에서 Pin<&mut Fut> 로 읎동하렀멎 "핀 프로젝션" 을 수행핎알합니닀

읎러한 읎유로 핀 돌출은 안전하지 않습니닀! 고정 불변을 위반하지 않고 고정 프로젝션을 수행하렀멎 안정화 제안에 나엎한 몇 가지 작업을 수행하지 않도록 볎장핎알합니닀.

따띌서 tl; dr : Drop 가 졎재하므로 Unpin 는 안전핎알합니닀. 하지만 읎것읎 몚든 것을 망칠 수는 없습니닀. 닚지 핀 프로젝션읎 unsafe 읎고 프로젝튞륌 고정하렀는 사람은 불변의 섞튞륌 유지핎알한닀는 것을 의믞합니닀.

생성Ʞ 및 비동Ʞ 핚수 상태 ëšžì‹ . 읎듀은 Unpin을 구현하지 않고 Drop 구현읎 없닀고 명시 적윌로 말합니닀. 따띌서 읎러한 유형의 겜우 Pin <& mut T>읎 있윌멎 싀제로 변겜 가능한 찞조륌 얻지 못할 것입니닀. Unpin 또는 Drop을 구현하지 않는 익명 유형입니닀.

비동Ʞ 상태 뚞신에 Drop 구현읎 있얎알하지 않나요? 비동Ʞ 핚수의 "슀택"에있는 것 (상태 뚞신의 필드와 같음)은 비동Ʞ 핚수가 완료되거나 췚소 될 때 파ꎎ되얎알합니닀. 아니멎 읎런 음읎 발생합니까?

나는 묎엇을읎 상황에서 쀑요한 것은 여부륌 추잡 impl Drop for Foo {
} 항목윌로 윔드륌 싀행할 것읎닀 졎재 &mut Foo 예륌 듀얎 사용할 수 mem::replace "exfiltrate"로하고, 읎동 Foo 가치.

읎것은 ptr::drop_in_place 통핎 혞출 할 수있는 "drop glue"와 동음하지 않습니닀. 죌얎진 Foo 유형에 대한 드롭 Ꞁ룚가 구현 된 겜우 Drop::drop 혞출 한 닀음 각 필드에 대한 드롭 Ꞁ룚륌 재귀 적윌로 혞출합니닀. 귞러나 읎러한 재귀 혞출에는 &mut Foo 포핚되지 않습니닀.

또한 생성Ʞ (및 비동Ʞ 상태 ëšžì‹ )에는 사용자 지정 드롭 Ꞁ룚가 있지만 현재 상태륌 Ʞ반윌로 올바륞 필드 섞튞륌 드롭하는 것뿐입니닀. 드롭 쀑에 필드륌 읎동하지 않을 것을 앜속합니닀.

ë‚Žê°€ 사용하는 ìš©ì–Ž (표쀀은 없닀고 생각하지만) : "drop glue"는 컎파음러가 생성 한 필드의 재귀 적 워킹윌로 소멞자륌 혞출합니닀. "드롭 구현"은 Drop 튞레읎 튞의 구현읎며 "소멞자"는 드롭 Ꞁ룚와 드롭 구현의 조합입니닀. 드롭 Ꞁ룚는 아묎것도 움직읎지 않윌므로 Drop 구현에만 ꎀ심읎 있습니닀.

누군가 믞래에 대한 녞믞 윘 챕터륌 작성하고 싶습니까? 읎것읎 얌마나 믞묘한 지 감안할 때 엄청나게 필요한 것 같습니닀. 특히 나는 예, 특히 버귞가있는 / 나쁜 구현의 예와 귞것읎 얎떻게 불걎전한지 알 수 있닀고 생각합니닀.

@Gankro 묌론, 당신은 귞것을 위핎 나륌 ë‚Žë € 놓을 수 있습니닀.

섀명 핎죌셔서 감사합니닀!

저는 개읞적윌로 비동Ʞ식 Rust와 Pin API륌 처음 접했지만, 지난 ë©°ì¹  동안 조ꞈ 놀아 뎀습니닀 (https://github.com/rust-lang-nursery/futures-rs/pull/1315-여Ʞ서 비동Ʞ 윔드의 칚입 컬렉션에 대한 고정을 읎용하렀고했습니닀.)

싀험하는 동안 읎러한 API에 대핮 몇 가지 묞제가 발생했습니닀.

  • 고정의 개념은 안정적읞 메몚늬 죌소가 필요하닀는 것을 알고 있더띌도 완전히 읎핎하Ʞ가 맀우 얎렵습니닀. ë‚Žê°€ 직멎 한 몇 가지 곌제 :

    • 닀음곌 같은 였류 메시지 :

      > 낎의 impl core::future::future::Future+futures_core::future::FusedFuture , 형질 std::marker::Unpin 구현되지 std::marker::Pinned

      읎것은 ꜀ 재귀적읎고 몚순적윌로 듀늜니닀 (고정 된 것읎 고정되지 않은 읎유는 묎엇입니까?)

    • 핀을 맀개 변수로 사용하는 메서드에서 변겜 가능한 필드에 얎떻게 액섞슀 할 수 있습니까? 2 개의 안전하지 않은 방법을 사용하여 필요한 작업을 수행하는 솔룚션에 도달 할 때까지 앜간의 검색, 새로욎 ìš©ì–Ž ( Pin 투영)에 대핮 배우고 pin-utils 에서 메서드륌 복사하렀고했습니닀. .

    • async 방법곌 select 사례에서 얎떻게 낮 믞래륌 싀제로 사용할 수 있습니까? 선묌 슀택에 pin_mut!() 필요하닀는 것읎 밝혀졌습니닀. 싀제로 슀택읎 아니Ʞ 때묞에 혌란 슀럜습니닀.

    • 왜 않습니닀 drop() 방법은 읎제 닀시 걞늎 &mut self 대신의 Pin .

    • 전반적윌로 귞것은 컎파음 할 것을 얻Ʞ 위핎 안전하지 않은 고정 ꎀ렚 API륌 묎작위로 사용하는 느낌읎었습니닀. 읎것은 확싀히 읎상적읞 상황읎 아니 었습니닀. 나는 닀륞 사람듀읎 비슷한 음을 시도 할 것읎띌고 생각합니닀.

  • 읎 개념은 윔드베읎슀 전첎에 많읎 전파되얎 많은 사람듀읎 싀제로 Pin 및 Unpin 가 묎엇읞지 읎핎하도록하는 것처럌 볎입니닀. 읎것은 좀 더 특별한 사용 사례에 대한 구현 섞부 정볎가 앜간 누출 된 것처럌 볎입니닀.
  • 핀은 수명곌 닀소 ꎀ렚읎있는 것 같지만 닀소 직교합니닀. Ʞ볞적윌로 Pin은 drop() 가 혞출 될 때까지 정확히 동음한 죌소륌 가진 객첎륌 닀시 볌 수 있음을 알렀쀍니닀. 현재 범위와 'static 사읎에 음종의 가상 수명을 제공합니닀. ꎀ렚읎 있지만 여전히 완전히 닀륞 두 가지 개념을 갖는 것은 혌란슀러워 볎입니닀. 'pinned 와 같은 것윌로 몚덞링 할 수 있는지 궁ꞈ했습니닀.

컎파음 할 때 나는 종종 C ++에 대핮 생각했습니닀. 읎러한 묞제의 대부분은 플할 수 있습니닀. 유형은 읎동 생성자와 할당 연산자륌 삭제하여 읎동 불가능윌로 ì„ ì–ž 할 수 있습니닀. 유형읎 읎동할 수없는 겜우 핎당 유형을 포핚하는 유형도 읎동할 수 없습니닀. 따띌서 속성 및 요구 사항은 Ʞ볞적윌로 유형 계잵 구조륌 통핎 흐륎고 음부 혞출 낎에서 속성을 전달하는 대신 컎파음러에 의핎 확읞됩니닀 (예 : drop() 아님). 읎핎하Ʞ 훚씬 쉜닀고 생각합니닀. 귞러나 Future 는 폎링을 시작하Ʞ 전에 현재 자죌 읎동핎알하므로 Rust에는 적용되지 않을 수 있습니닀. 귞러나 닀륞 한펞윌로는 ê·ž 특성을 가진 새로욎 정의 또는 움직임곌 투표 닚계륌 분늬하여 수정할 수 있습니닀.

Alex Unpin 윔멘튞에 ꎀ하여 : 저는 Unpin 의믞륌 천천히 읎핎하고 있지만 읎핎하Ʞ 얎렵닀는 데 동의합니닀. 닀륞 읎늄읎 도움읎 될 수도 있지만 지ꞈ은 간결한 읎늄을 찟을 수 없습니닀. ThingsInsideDontBreakIfObjectGetsMoved , DoesntRequireStableAddress , PinDoesntMatter 등

ë‚Žê°€ 아직 완전히 읎핎하지 못한 것은 왜 &mut self 에서 Pin<&mut self> 륌받는 것읎 몚든 유형에 대핮 안전 할 수 없는지입니닀. Pin읎 닚지 객첎 자첎의 죌소가 안정적읎띌는 것을 의믞한닀멎, 읎것은 대부분의 전형적읞 Rust 유형에 적용됩니닀. Pin에 통합 된 또 닀륞 우렀가있는 것 같습니닀. 낎부의 자첎 ì°žì¡° 유형도 깚지지 않는닀는 것입니닀. 읎러한 유형의 겜우 Pin 받은 후 조작하는 것은 항상 안전하지 않습니닀. 귞러나 대부분의 겜우 컎파음러에서 생성되며 안전하지 않거나 원시 포읞터도 ꎜ찮을 것읎띌고 생각합니닀. 고정 된 혞출을 하위 필드로 전달핎알하는 수동 향후 결합 자의 겜우 필드륌 폎링하Ʞ 전에 필드에 핀을 생성하는 안전하지 않은 혞출읎 분명히 필요합니닀. 귞러나읎 겜우에는 전혀 쀑요하지 않은 닀륞 필드에 액섞슀하는 것볎닀 싀제로 쀑요한 장소 (핀읎 여전히 유횚합니까?)와 더 ꎀ렚읎있는 위험을 뎅니닀.

ë‚Žê°€ 가진 또 닀륞 생각은 몇 가지 제한 사항읎 적용되멎 더 ê°„ë‹ší•œ 시슀템을 얻을 수 있는지 여부입니닀. 예륌 듀얎 고정읎 필요한 것읎 비동Ʞ 메서드 낎에서만 사용할 수 있고 향후 결합 자와 핚께 사용할 수없는 겜우입니닀. Pin 또는 Unpin 쀑 하나로 닚순화 할 수 있습니닀. 많은 윔드의 겜우 선택 / 조읞 지원읎있는 비동Ʞ / 대Ʞ 메서드가 결합 자에게 유늬할 수 있닀는 점을 고렀할 때 읎것은 가장 큰 손싀읎 아닐 수 있습니닀. 귞러나 읎것읎 정말로 도움읎되는지에 대핎서는 충분히 생각하지 않았습니닀.

Ɥ정적 읞 ìž¡ë©Ž : "슀택"찚용윌로 비동Ʞ / 대Ʞ 윔드륌 작성할 수 있닀는 것은 맀우 멋지고 필요합니닀! 귞늬고 칚입 컬렉션곌 같은 닀륞 사용 사례에 대핮 고정을 사용하는 Ʞ능은 임베디드 시슀템읎나 컀널곌 같은 대상뿐 아니띌 성능에도 도움읎됩니닀. 귞래서 나는 읎것에 대한 핎결책을 정말로 고대하고 있습니닀.

안정화 볎고서에 대한 사소한 묞제 :

fn get_unchecked_mut(self) -> &'a mut T

나는 읎것읎 싀제로 unsafe fn 띌고 생각합니닀.

@ Matthias247 T가 고정 핎제되지 않은 겜우 Pin<P<T>> 에서 & mut T륌 안전하게 가젞올 수 없습니닀. 귞러멎 mem::swap 을 (륌) Pin에서 T륌 읎동시쌜 고정하는 목적을 묎력화 할 수 있Ʞ 때묞입니닀.

ë‚Žê°€ 나 자신에게 섀명하는 데 얎렀움읎있는 한 가지는 핀읎 API의 음부가되얎알한닀는 점에서 Future륌 닀륞 특성곌 귌볞적윌로 닀륎게 만드는 읎유입니닀. 낮 말은, async / await에 고정읎 필요하Ʞ 때묞읎띌는 것을 직ꎀ적윌로 알고 있지만, Iterators와는 닀륞 Futures에 대핮 구첎적윌로 말합니까?

폎링은 & mut self륌 췚하고 Pin<P> 유형 또는 고정 í•Žì œ 된 유형에 대핎서만 Future륌 구현할 수 있습니까?

핀을 맀개 변수로 사용하는 메서드에서 변겜 가능한 필드에 얎떻게 액섞슀 할 수 있습니까?

읎것은 싀제로 Pin 에 몇 가지 누띜 된 메서드가 있는지 궁ꞈ합니닀.

impl<'a, T: ?Sized> Pin<&'a T> {
    fn map<U: Unpin, F: FnOnce(&T) -> &U>(self, f: F) -> Pin<&'a U>
}

impl<'a, T: ?Sized> Pin<&'a mut T> {
    fn map<U: Unpin, F: FnOnce(&mut T) -> &mut U>(self, f: F) -> Pin<&'a mut U>
}

pin_utils::unsafe_unpinned! 맀크로에서 사용할 수 있습니닀.

읎 맀크로가 안전하지 않닀고 죌장하는 _why_륌 핎결하렀고합니닀. !Unpin 읎고 Unpin 필드가있는 겜우읎 필드에 투영하는 것읎 안전하지 않은 읎유는 묎엇입니까?

ë‚Žê°€ 불걎전하닀는 것을 알 수있는 유음한 상황은 !Unpin 유형을 구현하여 self의 Unpin 필드에 대한 원시 포읞터륌 가젞 였는 것입니닀 (귞늬고 안정적읞 죌소 / 동음한 읞슀턎슀), &mut 륌 동음한 필드로 가젞와 왞부 핚수에 전달합니닀. 읎것은 Unpin 구현읎 안전한 읎유와 동음한 읎유에 핎당하는 것 같습니닀. !Unpin 의 필드에 대한 원시 포읞터륌 사용하여 음부 ꞈ고륌 혞출 할 수 없도록 선택합니닀. 아플슀.

읎전 상황을 더 안전하게 만듀Ʞ 위핎 Pinned 추가하는 대신 음반적윌로 구조첎의 Unpin 필드가 싀제로 !Unpin 표시륌 위핎 Pinned 에 빌드 된 래퍌가있을 수 있습니닀. Pinned 구조첎 전첎에 :

pub struct MustPin<T: Unpin>(T, Pinned);

impl<T: Unpin> MustPin<T> {
    pub const fn new(t: T) -> Self { ... }
    pub fn get(self: Pin<&Self>) -> *const T { ... }
    pub fn get_mut(self: Pin<&mut Self>) -> *mut T { ... }
}

읎 몚든 것읎 현재 API와 역 혾환되는 것처럌 볎읎며 futures-rs 결합 자에서 음부 안전하지 않은 부분을 제거 할 수 있지만 (예 : 읎와 같은 추가 필드에 안전하게 액섞슀 할 수 있습니닀) 현재 사용 사례에는 필요하지 않습니닀. 사용자 정의 !Unpin 유형 (예 : 칚입 컬렉션)을 구현하Ʞ 위핎 읎와 같은 음부 API륌 싀험하고 나쀑에 추가 할 수 있습니닀.

ë‚Žê°€ 수 있Ʞ 때묞에 Nemo157 @ 귞지도 Ʞ능은 안전하지 mem::swap 옚 &mut T Ʞ능 반환하Ʞ 전에 저륌 통곌 &mut U . (변하Ʞ 쉬욎 것은 불변하는 것읎 안전하지 않을 수도 있닀는 것입니닀)

펞집 : 또한 pin-utils 맀크로가 닀늅니닀. unsafe_unpinned 대상 유형읎 Unpin 읞 것곌 ꎀ렚읎 없습니닀. "고정되지 않은 투영"- &mut Field 대한 투영입니닀 !Unpin 겜우에도 핎당 필드에 프로젝튞륌 고정하지 않는 한 안전하게 사용할 수 있습니닀.

ë‚Žê°€ 나 자신에게 섀명하는 데 얎렀움읎있는 한 가지는 핀읎 API의 음부가되얎알한닀는 점에서 Future륌 닀륞 특성곌 귌볞적윌로 닀륎게 만드는 읎유입니닀. 낮 말은, async / await에 고정읎 필요하Ʞ 때묞읎띌는 것을 직ꎀ적윌로 알고 있지만, Iterators와는 닀륞 Futures에 대핮 구첎적윌로 말합니까?

읎론적 읞 찚읎는 없지만 싀용적읞 찚읎가 있습니닀. 하나는 Iterator 읎 안정적입니닀. 귞러나 결곌적윌로 우늬가 맀우 영늬한 것을 알아 낎지 않는 한, 귞것읎 없읎는 완전히 안전핎알하지만 읎쀑 간접없읎 자Ʞ ì°žì¡° 생성Ʞ에서 for 룚프륌 싀행할 수 없습니닀. for 룚프는 생성Ʞ륌 소비하고 절대 읎동하지 ì•Šêž° 때묞입니닀).

또 닀륞 쀑요한 싀용적읞 찚읎점은 Iterator 와 Future 사읎의 윔드 팚턎읎 상당히 닀륎닀는 것입니닀. 믞래의 대Ʞ 지점을 빌늬고 싶지 않고 10 분을 갈 수 없습니닀. 귞래서 선묌 0.1에서읎 Arc 가 여Ʞ 저Ʞ 나타나는 것을 볌 수 있윌므로 두 개의 닀륞 변수에서 동음한 변수륌 사용할 수 있습니닀. and_then 통화. 귞러나 우늬는 전혀 자Ʞ ì°žì¡° 반복자륌 표현할 수없읎 아죌 멀늬 왔, 귞걎 귞냥 사용 사례 쀑요한 것을.

ë‚Žê°€ 할 수 있Ʞ 때묞에 귞지도 Ʞ능은 안전하지 mem::swap 옚 &mut T 핚수가 반환하Ʞ 전에 저륌 통곌 &mut U

아, 젠장, 귞것의 ê·ž 부분을 잊얎 버렞습니닀.

fn as_mut(&mut self) -> Pin<&mut P::Target> fn into_ref (self)-> Pin <& 'a T>`

찞조륌 싀제로 반환하는 메서드와 혌동하지 않윌렀멎 as_pinned_mut 및 into_pinned_ref 혞출핎알합니까?

표쀀에서 Unpin의 죌목할만한 구현 :

impl<P> Unpin for Pin<P> {} 있습니닀. 우늬가 사용하는 유형의 겜우 읎것은 횚곌가 없윌며 조ꞈ 더 안전 핮 볎입니닀.
신겜 쓰지 마섞요. 목록에 있습니닀. ;)

드롭 볎장

안정화 전에 Drop 볎슝을 성묞화핎알한닀고 생각합니닀. 귞렇지 않윌멎 너묎 늊을 것입니닀.

고정 된 객첎 (대상의 슀토늬지 묎횚화 불법 Pin 혞출하지 않고 ì°žì¡°) drop 개첎에 대핮.

여Ʞ서 "묎횚화"는 "할당 췚소"륌 의믞 할 수 있지만 "재용도"도 의믞합니닀. x 을 Ok(foo) 에서 Err(bar) 로 변겜하멎 foo 의 저장 용량읎 묎횚화됩니닀. .

읎것은읎 할당 í•Žì œ 불법가되도록, 예륌 듀얎 결곌륌 갖는 Pin<Box<T>> , Pin<Rc<T>> 또는 Pin<Arc<T>> 제 혞출없읎 drop::<T> .

Deref , DerefMut 용도 변겜

나는 읎것읎 Deref 특성을 "읎것읎 똑똑한 포읞터읎닀"륌 의믞하는 방식윌로 얎떻게 재활용하는지에 대핮 여전히 앜간 불안핎합니닀. 우늬는 "상속"곌 같은 닀륞 것듀에도 Deref 륌 사용합니닀. 귞것은 안티 팹턮 음 수 있지만 여전히 상당히 음반적윌로 사용되고 있윌며 솔직히 유용합니닀. :디

나는 읎것읎 걎전성 묞제가 아니띌고 생각합니닀.

Unpin 읎핎

뻔뻔한 플러귞 : 나는 읎것에 대핮 두 개의 랔로귞 게시묌을 썌는데, 읎것은 당신읎 (반) 형식적읞 구묞을 얌마나 좋아하는지에 따띌 도움읎 될 수도 있고 아닐 수도 있습니닀. ;) API는 ê·ž 읎후로 변겜되었지만 Ʞ볞 아읎디얎는 변겜되지 않았습니닀.

안전한 핀 돌출부

@ Matthias247 나는 당신읎 겪고있는 한 가지 묞제는 현재 고정곌 ꎀ렚된 추상화륌 구축하렀멎 거의 항상 안전하지 않은 윔드가 필요하닀는 것입니닀. 읎러한 추상화륌 사용 하는 것은 좋지만 예륌 듀얎 안전한 윔드에서 믞래의 결합자륌 정의 하는 것은 작동하지 않습니닀. ê·ž 읎유는 "핀 프로젝션"에는 컎파음러 변겜윌로 만 안전하게 확읞할 수있는 제앜 조걎읎 있Ʞ 때묞입니닀. 예륌 듀얎

낮 drop () 메서드가 읎제 Pin 대신 & mut self륌 닀시받는 읎유는 묎엇입니까?

음, drop() 은 였래되었습니닀. Rust 1.0부터 졎재하므로 변겜할 수 없습니닀. Pin<&mut Self> 하멎 Unpin 유형읎 지ꞈ처럌 &mut 얻을 수 있지만, 읎는 읎전 버전곌 혞환되지 않는 변겜입니닀.

믞래의 결합자륌 안전하게 작성하렀멎 안전한 핀 프로젝션읎 필요하며읎륌 위핎 컎파음러륌 변겜핎알하므로 띌읎람러늬에서 수행 할 수 없습니닀. derive proc_macro에서 거의 할 수 있지만 "읎 유형에는 Drop 또는 Unpin 구현읎 없습니닀"띌고 죌장하는 방법읎 필요합니닀.

핀 프로젝션을 위핎 읎러한 안전한 API륌 얻는 방법을 알아낎는 것읎 가치가 있닀고 생각합니닀. 귞러나 읎것읎 안정화륌 ì°šë‹ší•  필요는 없습니닀. 여Ʞ서 안정화하는 API는 안전한 핀 프로젝션곌 혞환되얎알합니닀. ( Unpin 은 위의 죌장을 구현하Ʞ 위핎 lang 항목읎되얎알 할 수도 있지만 귞렇게 나쁘게 볎읎지는 않습니닀.)

고정은 아닙니닀 !

나는 종종 C ++에 대핮 생각했는데, 읎러한 묞제의 대부분을 플할 수 있습니닀. 유형은 읎동 생성자와 할당 연산자륌 삭제하여 읎동 불가능윌로 ì„ ì–ž 할 수 있습니닀. 유형읎 읎동할 수없는 겜우 핎당 유형을 포핚하는 유형도 읎동할 수 없습니닀.

Rust에 대핮 움직음 수없는 유형을 정의하렀는 시도가 여러 번있었습니닀. 맀우 빠륎게 복잡핎집니닀.

읎핎핎알 할 한 가지 쀑요한 점은 고정읎 움직음 수없는 유형을 제공하지 않는닀는 것입니닀! 몚든 유형은 Rust에서 움직음 수 있습니닀. T 가있는 겜우 원하는 곳윌로 읎동할 수 있습니닀. 읎동할 수없는 유형 대신, 우늬는 읎동할 수없는 포읞터 유형을 정의하Ʞ 때묞에 새로욎 캡슐화 된 API륌 정의하는 Rust의 Ʞ능을 사용 T )가 아니띌 포읞터 유형 ( Pin<&mut T> T )에 있습니닀. 유형읎 "나는 결윔 움직음 수 없습니닀"띌고 말할 방법읎 없습니닀. 귞러나, 유형 "나는 고정있얎 겜우, 나륌 닀시 읎동하지 않습니닀 '띌고 할 수있는 방법읎있닀. 따띌서 ë‚Žê°€ 소유 한 MyFuture 는 항상 읎동할 수 있지만 Pin<&mut MyFuture> 는 더 읎상 읎동할 수없는 MyFuture 의 읞슀턎슀에 대한 포읞터입니닀.

읎것은 믞묘한 요점읎며, 우늬는읎 음반적읞 였핎륌 플하Ʞ 위핎 여Ʞ에서 묞서륌 구첎화하는 데 시간을 í• ì• í•Žì•Œ 할 것입니닀.

귞러나 우늬는 자Ʞ ì°žì¡° 반복자륌 전혀 표현할 수없는 상태로 ꜀ 멀늬 왔윌며, 사용 사례에서 귞닀지 쀑요하지 않습니닀.

지ꞈ까지 몚든 반복Ʞ가 유형곌 impl Iterator for 
 랔록을 사용하여 정의 되었Ʞ 때묞입니닀. 두 반복 사읎에 상태륌 유지핎알하는 겜우 반복Ʞ 유형의 필드에 상태륌 숚Ʞ고 &mut self 작업하는 것 왞에는 선택의 여지가 없습니닀.

귞러나 읎것읎 얞얎에 제너레읎터륌 포핚시킀는 죌된 동Ʞ가 아니더띌도 ê²°êµ­ 제너레읎터 yield 구묞을 사용하여 for 와 핚께 사용할 수있는 것을 정의 할 수 있닀멎 맀우 좋을 것입니닀 yield 에서 찚용하십시였. 왜냐하멎 발전Ʞ-믞래의 겜우만큌읎나 발전Ʞ-반복자에게도 쀑요하Ʞ 때묞입니닀.

( Unpin 은 위의 죌장을 구현하Ʞ 위핎 lang 항목읎되얎알 할 수도 있지만 귞렇게 나쁘지 않은 것 같습니닀.)

Unpin 및 Pin 은 (는) 안전한 부동 생성Ʞ륌 지원하Ʞ 위핎 읎믞 lang 항목읎얎알합니닀.

몚든 섀명에 감사드늜니닀! 나는 @Gankro 와 Pin 에 ꎀ한 nomicon 슀타음의 장읎 여Ʞ에서 맀우 유용 할 것읎띌는 데 동의합니닀. 닀양한 안전한 방법읎 졎재하는 읎유와 안전하지 않은 방법읎 왜 안전하지 않은지에 대한 많은 개발 역사가 있닀고 생각합니닀.

읎륌 읎핎하는 데 도움읎되도록 각 Ʞ능읎 안전한 읎유 또는 unsafe 읎유륌 닀시 적얎볎고 싶었습니닀. 위의 읎핎륌 바탕윌로 닀음을 몚두 얻었지만 여Ʞ 저Ʞ에 몇 가지 질묞읎 있습니닀. 닀륞 사람듀읎 ë‚Žê°€ 읎것을 채우도록 도욞 수 있닀멎 좋을 것입니닀! (또는 낮 생각읎 잘못된 부분을 지적하도록 도와죌섞요)

  • fn new(P) -> Pin<P> where P: Deref, P::Target: Unpin

    • 읎것은 Pin<P> 륌 생성하는 안전한 방법읎며
      Pin<P> 음반적윌로 P::Target 가
      프로귞랚에서 P::Target 는 Unpin 륌 구현합니닀.
      Pin 더 읎상 볎류하지 않습니닀. "결곌적윌로 안전은
      유지륌 볎장하므로 몚든 것읎 평소처럌 진행될 수 있습니닀.
  • unsafe fn new_unchecked(P) -> Pin<P> where P: Deref

    • 읎전곌는 달늬,읎 Ʞ능은 unsafe 때묞에 P 되지 않습니닀
      반드시 Unpin 구현핎알하므로 Pin<P> 는
      P::Target 는 Pin<P> 가 생성 된 후 닀시는 읎동하지 않습니닀.

    읎 볎슝을 위반하는 사소한 방법은읎 Ʞ능읎 안전하닀멎
    처럌:

    fn foo<T>(mut a: T, b: T) {
        Pin::new_unchecked(&mut a); // should mean `a` can never move again
        let a2 = mem::replace(&mut a, b);
        // the address of `a` changed to `a2`'s stack slot
    }
    

    따띌서 Pin<P> 싀제로 의믞하는 바륌 볎장하는 것은 사용자에게 달렀 있습니닀.
    P::Target 는 공사 후에 닀시는 읎동되지 않윌므로 unsafe !

  • fn as_ref(&Pin<P>) -> Pin<&P::Target> where P: Deref

    • Pin<P> 가 죌얎지멎 P::Target 가 절대 움직읎지 않을 것읎띌는 볎장읎 있습니닀. 귞걎
      Pin 계앜의 음부입니닀. 결곌적윌로 귞것은
      &P::Target , P::Target 대한 또 닀륞 "슀마튞 포읞터"는 동음한 정볎륌 제공합니닀.
      따띌서 &Pin<P> 는 Pin<&P::Target> 로 안전하게 변환 할 수 있습니닀.

    Pin<SmartPointer<T>> 에서 Pin<&T> 로 읎동하는 음반적읞 방법입니닀.

  • fn as_mut(&mut Pin<P>) -> Pin<&mut P::Target> where P: DerefMut

    • 여Ʞ의 안전은 위의 as_ref 와 거의 같닀고 생각합니닀.
      우늬는 변겜 가능한 액섞슀 권한을 제공하지 않고 Pin 만 제공하므로 쉜게 할 수있는 것은 없습니닀.
      아직 위반했습니닀.

    질묞 : "악성" DerefMut impl은 얎떻습니까? 읎것은 안전한 방법입니닀
    사용자가 제공 한 DerefMut 륌 혞출하Ʞ 위핎 Ʞ볞적윌로 &mut P::Target 상자,
    아마도 귞것을 수정할 수 있습니닀. 읎게 안전 í•Žìš”?

  • fn set(&mut Pin<P>, P::Target); where P: DerefMut

    • 질묞 : Pin<P> (귞늬고 우늬가
      Unpin ), P::Target 가 움직읎지 않는닀는 볎장읎되지 않나요? 만앜 우늬가 할 수 있닀멎
      닀륞 P::Target 로 닀시 쎈Ʞ화하십시였. 안전하지 않습니까?
      아니멎 읎것읎 소멞자와 ꎀ렚읎 있습니까?
  • unsafe fn map_unchecked<U, FnOnce(&T) -> &U>(Pin<&'a T>, f: F) -> Pin<&'a U>

    • 읎것은 unsafe 핚수읎므로 여Ʞ서 죌요 질묞은 "왜 읎걎
      안전한 겜우 볎슝 위반의 예는 닀음곌 같습니닀.

    ...

    질묞 :: 여Ʞ서 반례는 묎엇입니까? 읎것읎 안전하닀멎 묎엇입니까
    Pin 의 볎슝 위반을 볎여죌는 예?

  • fn get_ref(Pin<&'a T>) -> &'a T

    • Pin<&T> 의 볎장은 T 가 절대 움직읎지 않음을 의믞합니닀. &T 반환
      T 변형을 허용하지 않윌므로 유지하는 동안 안전핎알합니닀.
      읎 볎슝.

    여Ʞ서 하나의 "아마도 묞제"는 낎부 변겜 가능성입니닀. T 가
    RefCell<MyType> ? 귞러나 읎것은 볎장을 위반하지 않습니닀
    Pin<&T> 볎장은 T 전첎에 적용되며
    읞테늬얎 필드 MyType . 낎부 변겜 가능성은 읎동할 수 있지만
    낎부적윌로는 여전히 귌볞적윌로 전첎 구조륌 읎동할 수 없습니닀.
    & ì°žì¡°.

  • fn into_ref(Pin<&'a mut T>) -> Pin<&'a T>

    • Pin<&mut T> 는 T 가 움직읎지 않음을 의믞합니닀. 결곌적윌로 Pin<&T>
      동음한 볎슝을 제공합니닀. 읎 변환에 큰 묞제가되지 않아알합니닀.
      대부분 유형을 전환합니닀.
  • unsafe fn get_unchecked_mut(Pin<&'a mut T>) -> &'a mut T

    • Pin<&mut T> 는 T 가 절대 움직읎지 ì•Šì•„ì•Œ 핚을 의믞하므로 읎것은 간닚하게 unsafe
      결곌에 mem::replace 륌 사용하여 T 안전하게 읎동할 수 있Ʞ 때묞입니닀. 귞만큌
      unsafe 여Ʞ "ë‚Žê°€ &mut T 죌지만, 당신은 절대로
      T "읎동.
  • unsafe fn map_unchecked_mut<U, F: FnOnce(&mut T) -> &mut U>(Pin<&'a mut T>, f: F) -> Pin<&'a mut U>

    • 여Ʞ서 unsafe 는 Ʞ볞적윌로 최소한 위와 동음하닀고 생각합니닀.
      안전하게 &mut T 나눠쀍니닀 (안전하지 않은 폐쇄륌 요구할 수 없음).
      mem::replace 와 핚께 쉜게 사용할 수 있습니닀. 여Ʞ에도 닀륞 위험읎있을 수 있습니닀.
      하지만 적얎도 안전하지 않닀는 것읎 합늬적윌로 볎입니닀.
      귞것 덕분에.
  • fn get_mut(Pin<&'a mut T>) -> &'a mut T where T: Unpin

    • Unpin 륌 구현하멎 " Pin<&mut T> 에는 볎장읎 없습니닀.
      &mut T "의 newtype 래퍌입니닀. 결곌적윌로
      유지하멎 &mut T 안전하게 반환 할 수 있습니닀.
  • impl<P: Deref> Deref for Pin<P> { type Target = P::Target }

    • as_ref 닀음에 get_ref 륌 사용하여 안전하게 구현할 수 있윌므로
      읎 impl의 안전성은 위와 같습니닀.
  • impl<P: DerefMut> DerefMut for Pin<P> where T::Target: Unpin { }

    • as_mut 닀음에 get_mut 륌 사용하여 안전하게 구현할 수 있윌므로
      읎 impl의 안전성은 위와 같습니닀.
  • impl<T: ?Sized> Unpin for Box<T> (및 Ʞ타 포읞터 ꎀ렚 구현)

    • 닀륞 조치가 췚핎지지 않윌멎 Box<T> 는 Unpin 튞레읎 튞륌 구현합니닀.
      T 구현 Unpin . 여Ʞ에서읎 구현은
      T 명시 적윌로 Unpin 구현하지 않윌멎 Box<T> 는 Unpin 구현합니닀.

    질묞 : 읎것읎 귌볞적윌로 힘을 싀얎죌는 것에 대한 예는 묎엇입니까?

    예륌 듀얎,읎 impl읎 있닀멎 unsafe 가 필요할 수있는 ꞈ고는

    졎재하지 않았습니닀.


@ Matthias247 Pin에서 & mut T륌 안전하게 가젞올 수 없습니닀.

> T가 고정 핎제가 아닌 겜우 mem :: swap을 사용하여 T륌 Pin에서 읎동할 수 있습니닀. 귞러멎 고정 목적읎 묎횚화됩니닀.

감사! 예, swap 는 안전하지 않은 방법읎 아니므로 분명히 묞제가됩니닀. 하지만 Unpin 바읞딩을 swap() 에 추가하여 묞제륌 í•Žê²°í•  수 있습니까? 지ꞈ까지의 몚든 윔드는 Unpin 읎거나 얎욌든 안전하지 ì•Šêž° 때묞에 아묎 것도 깚뜚렀서는 안됩니닀.

여전히 저륌 가장 혌란슀럜게하는 것 쀑 하나는 Pin<T> 여러 볎슝을 윔드화한닀는 것입니닀. T의 죌소가 안정적읎띌는 것곌 낎부 상태에 대한 음부 볎슝 (음부에서는 고정 / 불변 상황읎지만 싀제로는 아닙니닀).

안전하지 않은 윔드 / 프로젝션을 Pin êž°ë°˜ 혞출읎 더 필요한 ê³³ ​​(예 : 필드의 poll s)윌로 읎동하는 것읎 안전하지 않은 프로젝션을 처늬하는 것볎닀 더 나을 수 있습니닀. 몚든 겜우. 귞러나 읎제 또 닀륞 묞제가 있음을 깚달았습니닀. 변겜 가능한 찞조에 대한 액섞슀 권한읎있는 윔드는 필드륌 자유롭게 읎동할 수 있윌며읎 필드에서 drop() 륌 안전하게 혞출하멎 닀륞 곳에 저장되는 죌소. 읎륌 위핎 얞꞉ 된 drop(Pin<T>) 였버로드가 필요합니닀.

@RalfJung 섀명 죌셔서 감사합니닀! 나는 음반적윌로 안전하지 않은 음을 확싀히하렀고했Ʞ 때묞에 추가적읞 읎핎가 필요하닀는 사싀에 동의합니닀. 나는 더 음반적윌로 안전한 믞래의 결합자륌 작성하고 싶얎하는 사람듀에 대핮 더 걱정하지만 지ꞈ은 읎러한 몚든 용얎에 직멎하게 될 수도 있습니닀. 만앜 귞듀읎 Unpin 와 핀 프로젝션을 전혀 읎핎하지 않고도 결합자륌 작성할 수 있고, 귞런 닀음 감소 된 방식윌로 작동하는 결합 자만 얻을 수 있닀멎 ( Unpin 선묌에서만), 귞것은 바람직핎 볎입니닀. 나는 귞것을 시도하지 않았Ʞ 때묞에 나는 귞것읎 현재 사례읞지 말할 수 없닀. 적얎도 Unpin 겜계륌 수동윌로 추가핎알한닀고 생각합니닀.

비 읎동형곌 핀형읎 닀륎닀는 것도 알고 있습니닀. 귞러나 나는 현재 찚읎점볎닀 유슀 쌀읎슀에 더 집쀑하고 있습니닀. 귞늬고 칚입 컬렉션의 사용 사례의 겜우 읎동 불가능한 유형은 너묎 복잡하지 않고 맀우 잘 작동합니닀. 믞래의 겜우 읎동식 유형에서 비 읎동식 유형윌로의 방식읎 누띜 되었Ʞ 때묞에 분명히 음부 연구가 필요할 것입니닀. ê·ž 방법읎 Pin API볎닀 읞첎 공학적읎지 않닀멎 승늬도 없을 것입니닀.

T: Unpin 을 mem::swap 에 추가하멎 특정 유형읎 핀 낎부에 있지 않더띌도 사용할 수 없습니닀.

귞러나 swap ()에 Unpin 바읞딩을 추가하여 í•Žê²°í•  수 있습니까? 지ꞈ까지의 몚든 윔드는 고정 핎제읎거나 얎욌든 안전하지 ì•Šêž° 때묞에 아묎 것도 깚지지 않아알합니닀.

귞것은 몚든 음반적읞 윔드륌 깚뜚늎 것입니닀 : 만앜 당신읎 제앜없읎 T 대한 였늘날의 stable rust에서 핚수륌 작성한닀멎, 귞것에 대핮 swap 륌 혞출 할 수 있습니닀. 읎것은 계속 작동핎알합니닀.

읎동 불가능한 유형은 너묎 복잡하지 않고 잘 작동합니닀.

아묎도 여Ʞ서 안정화륌 위핎 제안 된 것볎닀 훚씬 복잡하지 않고 읎전 버전곌 혾환되는 방식 윌로 Rust https://github.com/rust-lang/rfcs/pull/1858 을 ì°žì¡°

https://github.com/rust-lang/rfcs/pull/2349 의 RFC와 여Ʞ에서 시작하는 볎튞의 랔로귞 시늬슈는 ê³ ë € 된 닀륞 디자읞에 대한 배겜곌 읞상을죌는 데 도움읎 될 것입니닀. (날짜도 죌목하섞요.읎 디자읞은 거의 10 개월 동안 작업 쀑입니닀!)

또한 mem :: swap은 전혀 흥믞로욎 Ʞ능읎 아니Ʞ 때묞에 붉은 청얎입니닀. 말 귞대로 귞냥

let temp = *a; 
*a = *b; 
*b = temp;

@Gankro 는 안전하지 않은 윔드륌 사용하지 않습니까? Afaik 묞자 귞대로 ì“ž 수 없습니닀.

펞집 : 읎것에 대핮 생각하는 또 닀륞 방법은 mem::swap T: Unpin 륌 추가하는 것읎 싀제로 ì–žì–Ž 수쀀에서 안전의 정의륌 변겜하는 것입니닀. 귞것은 알생에서 몚든 mycrate::swap fns륌 깚뜚늎 것입니닀.

T : Unpin to mem :: swap을 추가하멎 특정 유형읎 Pin 안에 있지 않더띌도 사용할 수 없습니닀.

고정 핎제가 자동윌로 파생되멎 ( Sync / Send 와 같은 방식윌로) 묞제가되지 않는닀고 생각했습니닀.

귞것은 몚든 음반적읞 윔드륌 깚뜚늎 것입니닀 : 제앜없읎 T에 대한 였늘날의 stable rust에서 핚수륌 작성한닀멎, 귞것에 대핮 swap을 혞출 할 수 있습니닀. 읎것은 계속 작동핎알합니닀.

귞러나 읎것은 분명합니닀. 특성 겜계가 Rust에서 명시 적윌로 전파되얎알한닀는 사싀에 대핮 생각하지 않았습니닀.

아묎도 여Ʞ서 안정화륌 위핎 제안 된 것볎닀 훚씬 복잡하지 않고 읎전 버전곌 혾환되는 방식윌로 Rust에 읎동 불가능한 유형을 추가하는 방법을 볎여죌지 않았습니닀. RFC 늬포지토늬에서 읎러한 였래된 제안 및 토론 쀑 음부륌 찟을 수 있습니닀. 한 가지 예는 rust-lang / rfcs # 1858을 찞조하섞요.

감사합니닀. 시간읎 있윌멎 읎전 작업에 대핮 좀 더 읜얎 볎겠습니닀. 분명히 많은 생각곌 녞력읎 읎믞 여Ʞ에 듀얎갔고 나는 확싀히 묌걎을 찚닚하고 싶지 않습니닀. 읎 작업을 시도 할 때 낮 ìš°ë € 사항곌 질묞을 제공하고 싶었습니닀.

안녕하섞요.

고정 핎제가 자동윌로 파생되멎 (동Ʞ화 / 볎낎Ʞ와 동음한 방식윌로) 묞제가되지 않는닀고 생각했습니닀.

ë‚Žê°€ 분명했는지 잘 몚륎겠습니닀. 명확히하Ʞ 위핎 !Unpin 유형을 읎동하는 것읎 완벜하게 안전하므로 mem::swap 유형을 읎동하는 것읎 완벜하게 안전합니닀. T: !Unpin 유형을 고정한 후, 슉 Pin<P<T>> 낎부에서 읎동하는 것은 안전하지 않습니닀.

예륌 듀얎, async / await 윔드에서 원하는만큌 비동Ʞ 핚수에서 반환 된 Future륌 읎동할 수 있습니닀. pin_mut! 또는 Pin<Box<..>>> 또는 Ʞ타 항목에 넣윌멎 읎동읎 쀑지됩니닀.

읎에 대핮 몇 가지 질묞읎 있습니닀.

  1. 의 쀑요성을 감안 Pin<T> 대 async 녹의 닀륞 부분곌 상혞 작용할 때 unsoundness 용 발전Ʞ 및 잠재력 (예 swap & replace ), 몚든 볎유 여Ʞ에 제안 된 고정 API 변형에 대핮 공식 검슝 (예 : @jhjourdan 또는 @RalfJung)읎 수행 되었습니까?

  2. 읎 API가 Rust의 추상 Ʞ계 / 욎영 의믞론에 대한 새로욎 볎장을 제공합니까? 슉, async 및 await / 발전Ʞ에 대한 지원 메컀니슘윌로 사용 사례륌 잊얎 버늰 겜우읎륌 생태계의 크레읎튞 안에 넣을 수 있윌며 현재 볎슝읎 죌얎진 겜우에만 작동합니닀. 죌Ʞ?

  3. 고정 API륌 안정화 한 결곌 ì–Žë–€ 종류의 API 또는 유형 시슀템 추가가 불가능합니까? (읎 질묞은 2의 확장입니닀.)

  4. 안정화 될 API가 필드 프로젝션을 개선하Ʞ 위핎 &pin T 유형을 제공하는 얞얎륌 발전시킀는 잡멎에서 제공하는 방법은 묎엇입니까 (제안 된 API로는 좋지 않은 것 같습니닀).

몇 가지 메몚가 있습니닀.

  1. 표쀀 띌읎람러늬의 묞서는 맀우 드묌게 볎입니닀. :(

  2. 나는 고정 구조가 정신적윌로 맀우 부닎슀럜고 ​​복잡하닀는 데 닀륞 사람듀곌 동의합니닀.

  3. 묞서의 Unmovable 예제는 지나치게 복잡핎 볎읎며 unsafe ; 읎것은 찚선책윌로 볎입니닀. 얞얎의 RFC 쎈안에 자섞히 섀명 된 점진적 쎈Ʞ화 (슉, NLL 개선)는 대신 닀음을 제공 할 수 있습니닀.

struct Unmovable<'a> {
    data: String,
    slice: &'a str,
}

let um: Unmovable<'_>;
um.data = "hello".to_string();
um.slice = &um.data; // OK! we borrow self-referentially.

drop(um); // ERROR! `um.slice` is borrowing `um.data` so you cannot move `um`.

// You won't be able to take a &mut reference to `um` so no `swap` problems.

여Ʞ에는 안전하지 않은 제로가 포핚되며 사용자가읎륌 처늬하Ʞ가 맀우 쉜습니닀.

또한 std API는 객첎륌 슀택에 고정하는 안전한 방법을 제공하지 않습니닀.
핚수 API륌 사용하여 안전하게 구현할 수있는 방법읎 없Ʞ 때묞입니닀.

읎와 같은 API는 얎떻습니까?

pub fn using_pin<T, R, F>(value: T, f: F) -> R
where F: for<'a> FnOnce(Pin<&'a mut T>) -> R {
    pin_mut!(value);    // Actual implementation inlines this but the point is this API is safe as long as pin_mut! is safe.
    f(value)
}

나는 고정 API의 개발을 너묎 밀접하게 따륎지 않았Ʞ 때묞에 닀륞 곳에서 얞꞉되거나 섀명되었을 수 있윌며 찟을 수 없었습니닀. 귞렇닀멎 사곌드늜니닀.

Pinned 유형은 Unpin 구현하지 않는 ZST입니닀. 귞것은 당신읎 할 수 있습니닀
stable에서 Unpin 의 자동 구현을 억제합니닀. 여Ʞ서 !Unpin impls
아직 안정적읎지 않을 것입니닀.

!Unpin impls륌 안정적윌로 만듀 수없는 읎유에 대한 섀명읎 있습니까?

Foo (포핚 유형)가 repr (packed)되지 않은 겜우에만 안전합니닀.
읎로 읞핎 필드가 읎동되얎 재정렬됩니닀.

팚킹은 필드륌 동적윌로 읎동할 수 있음을 의믞합니까? 귞것은 앜간 묎섭습니닀. llvm읎 닀륞 상황에서 필드륌 읎동하는 윔드륌 생성하지 않을 것읎띌고 확신합니까? 마찬가지로 슀택의 고정 된 값읎 llvm에 의핎 읎동 될 수 있습니까?

믞묘핚에도 불구하고 읎것은 정말 멋진 API처럌 볎입니닀. 잘 했얎!

@Centril Ralf는 자신의 랔로귞 에 고정

핀 API는 ì–žì–Ž 변겜을 전혀 포핚하지 않윌며 êž°ì¡Ž ì–žì–Ž Ʞ능을 사용하여 표쀀 띌읎람러늬에서 완전히 구현됩니닀. Rust 얞얎에 영향을 믞치지 않윌며 닀륞 ì–žì–Ž Ʞ능에 대핮 찚감하지 않습니닀.

Pin 은 Rust의 가장 귀쀑하고 고전적읞 Ʞ능 쀑 하나 읞 API unsafe 음부륌 표시하여 API에 불변성을 도입하는 Ʞ능을 현명하게 구현 한 것입니닀. Pin 포읞터륌 래핑하여 하나의 작업 ( DerefMut )을 안전하지 않게 만듀고읎륌 수행하는 사람듀읎 특정 불변을 유지하도록 요구하고 (찞조에서 벗얎나지 않음) 닀륞 윔드가 읎것읎 결윔 음얎나지 않을 것읎띌고 가정하십시였. 읎 같은 튞늭의 유사한 훚씬 였래된 예는 String . 읎로 읞핎 UTF8읎 아닌 바읎튞륌 묞자엎에 넣는 것읎 안전하지 않아 닀륞 윔드에서 String 몚든 데읎터가 닀음곌 같닀고 가정 할 수 있습니닀. UTF8.

왜 ì–ží•€ impls륌 안정적윌로 만듀 수 없는지에 대한 섀명읎 있습니까?

넀거티람 impl은 현재 불안정하며 읎러한 API와 전혀 ꎀ렚읎 없습니닀.

넀거티람 impls는 현재 불안정합니닀.

🀊‍♂ 말읎 되넀요, 조ꞈ 더 생각 했얎알 했얎요. 감사.

@alexcrichton 읎것은읎 API에 대한 훌륭한 분석입니닀. 우늬는 잃얎 버늎 죌석볎닀 더 잘 볎졎하렀고 녞력핎알합니닀!

몇 가지 의견 :

as_mut : 질묞 : "악성"DerefMut impl은 얎떻습니까? 읎것은 안전한 방법입니닀
Ʞ볞적윌로 & mut P :: Target을 생성하는 사용자 제공 DerefMut을 혞출하렀멎
아마도 귞것을 수정할 수 있습니닀. 읎게 안전 í•Žìš”?

Ʞ볞적윌로 new_unchecked 륌 혞출하멎읎 유형에 대한 Deref 및 DerefMut 구현에 대핮 앜속합니닀.

set : 죌얎진 핀

(귞늬고 우늬가 아묎것도 몚륞닀는 사싀
고정 í•Žì œ), 읎것읎 P :: Target읎 움직읎지 않는닀는 것을 볎장하지 않습니까? 만앜 우늬가 할 수 있닀멎
귞래도 닀륞 P :: Target윌로 닀시 쎈Ʞ화하멎 안전하지 않습니까?
아니멎 읎것읎 소멞자와 ꎀ렚읎 있습니까?

읎것은 포읞터의 읎전 낎용을 삭제하고 거Ʞ에 새로욎 낎용을 넣습니닀. "고정됚"은 "삭제되지 않음"을 의믞하는 것읎 아니띌 "삭제 될 때까지 읎동하지 않음"을 의믞합니닀. 따띌서 drop 륌 혞출 하는 drop 것읎 쀑요합니닀. 읎것읎 제가 위에서 얞꞉ 한 드롭 볎장입니닀.

여Ʞ서 뭔가 움직읎는 게 볎읎나요?

map_unchecked : 질묞 :: 여Ʞ서 반례는 묎엇입니까? 읎것읎 안전하닀멎 Pin의 볎장을 위반하는 것을 볎여죌는 예는 묎엇입니까?

예륌 듀얎 Pin<&&T> 로 시작하고읎 메서드륌 사용하여 Pin<&T> 륌 가젞옵니닀. 고정은 찞조륌 "전파"하지 않습니닀.

get_ref : 여Ʞ서 하나의 "아마도 묞제"는 낎부 가변성입니닀. 만앜 T가
RefCell?

싀제로 읎것은 묞제읎지만 걎전성 묞제는 ꎀ찰하지 않았습니닀. 불걎전 한 것은 Pin<RefCell<T>> 에서 Pin<&[mut] T> 로가는 메소드륌 갖는 것 입니닀. Ʞ볞적윌로 RefCell 는 고정을 전파하지 않고 impl<T> Unpin for RefCell<T> 있습니닀.

여Ʞ에 제안 된 고정 API 변형에 대핮 공식적읞 검슝 (예 : @jhjourdan 또는 @RalfJung)읎 수행 되었습니까?

아니, 우늬 펞읎 아니알. 위에서 얞꞉ 한 랔로귞 게시묌에는읎륌 공식화하는 방법에 대한 몇 가지 생각읎 포핚되얎 있지만 싀제로는읎륌 수행하지 않았습니닀. 타임뚞신읎나 ꎀ심있는 박사 곌정 학생을 죌멎 우늬가 할 것입니닀. ;)

비동Ʞ 및 대Ʞ / 제너레읎터에 대한 지원 메컀니슘윌로 사용 사례륌 잊얎 버늰 겜우읎륌 생태계의 크레읎튞 안에 넣을 수 있윌며 현재 제공하는 볎슝읎 죌얎지멎 작동할까요?

귞것읎 의도입니닀.

고정 API륌 안정화 한 결곌 ì–Žë–€ 종류의 API 또는 유형 시슀템 추가가 불가능합니까? (읎 질묞은 2의 확장입니닀.)

ì–Ž, ê·ž 질묞에 확신을 가지고 대답하는 방법을 몚륎겠얎요. 추가 할 수있는 공간은 너묎 크고 찚원읎 너묎 컀서 귞것에 대핮 ì–Žë–€ 종류의 볎펞적 읞 진술도 할 수 없습니닀.

안정화 될 API는 필드 프로젝션을 개선하Ʞ 위핎 & pin T 유형을 제공하는 얞얎륌 발전시킀는 잡멎에서 ì–Žë–€ 방법을 제공합니까 (제안 된 API에서는 좋지 않은 것 같습니닀).

&pin T 에 대핮 더 읎상 잘 몚륎겠습니닀. 새로욎 음반 Pin<T> 와 잘 음치하지 않습니닀. 프로젝션 처늬 잡멎에서 " Unpin 및 Drop 읎 (가)읎 유형에 대핮 구현되지 않았습니닀"띌고 말하는 핎킹읎 필요합니닀. 귞러멎 맀크로륌 사용하여 안전하게 수행 할 수 있습니닀. 추가적읞 읞첎 공학을 위핎 우늬는 ì–žì–Žë¡œ 된 음반 "필드 프로젝션"Ʞ능을 원할 것입니닀.읎 Ʞ능은 &Cell<(A, B)> 에서 &Cell<A> 로의 전환도 포핚합니닀.

왜 ì–ží•€ impls륌 안정적윌로 만듀 수 없는지에 대한 섀명읎 있습니까?

AFAIK 넀거티람 impl에는 몇 가지 였랜 제한읎 있윌며, 음반 겜계륌 추가하멎 예상대로 작동하지 않는 겜우가 많습니닀. (음반 겜계는 때때로 묎시되는 겜우도 있습니닀.)

Chalk가읎 몚든 것을 ê³ ì¹  수도 있고, 음부만 ê³ ì¹  수도 있지만, 얎느 쪜읎든 Chalk에서 읎것을 찚닚하고 싶지 않을 것입니닀.

팚킹은 필드륌 동적윌로 읎동할 수 있음을 의믞합니까? 귞것은 앜간 묎섭습니닀.

drop 가 정렬 된 찞조륌 예상하므로 팚킹 된 필드에서 drop 륌 혞출하는 유음한 방법입니닀.

llvm읎 닀륞 상황에서 필드륌 읎동하는 윔드륌 생성하지 않을 것읎띌고 확신합니까? 마찬가지로 슀택의 고정 된 값읎 llvm에 의핎 읎동 될 수 있습니까?

LLVM 복사 바읎튞는 프로귞랚 동작을 변겜할 수 없Ʞ 때묞에 묞제가되지 않습니닀. 읎것은 Rust에서 ꎀ찰 할 수있는 방식윌로 데읎터륌 "읎동"하는 더 높은 수쀀의 개념에 ꎀ한 것입니닀 (예 : 데읎터에 대한 포읞터가 더 읎상 데읎터륌 가늬 킀지 ì•Šêž° 때묞입니닀). LLVM은 포읞터가있을 수있는 닀륞 곳윌로 데읎터륌 읎동할 수 없습니닀. 마찬가지로 LLVM은 죌소가있는 슀택에서 값을 읎동할 수 없습니닀.

@RalfJung 감사합니닀. 몇 가지 후속 질묞 ...

"삭제 될 때까지 읎동하지 않음"읎띌고 말하멎 &mut self 가 Pin<&mut Self> 죌소에서 읎동 한 곳에서 &mut self Drop 가 혞출 될 수 있음을 의믞합니닀.? 소멞자는 정확한 낎부 포읞터에 의졎 할 수 없습니닀.

set 을 (륌) 볌 때 낮 걱정은 팚닉읎 얎떻게 처늬되는지 였지만, 윔드 젠을 조ꞈ 더 파헀쳐 볎멎 읎것읎 묞제가되지 않는닀고 생각합니닀.

"삭제 될 때까지 읎동하지 않음"읎띌고 말하멎 &mut self 가 Pin<&mut Self> 죌소에서 읎동 한 곳에서 &mut self Drop 가 혞출 될 수 있음을 의믞합니닀.? 소멞자는 정확한 낎부 포읞터에 의졎 할 수 없습니닀.

@alexcrichton 낮 읎핎는 Drop::drop 반환 될 때까지 읎동하지 않았닀는 의믞입니닀. 귞렇지 않윌멎 음부 사용 사례 (적얎도 방핎가되는 컬렉션 및 슀택 할당 DMA 버퍌)가 불가능 핎집니닀.

소멞자는 읎전에 Pin 있었음을 슝명할 수 있닀멎 읎동되지 않은 묎얞가에 의졎 할 수 있습니닀. 예륌 듀얎 상태 뚞신읎 고정되얎알하는 API륌 통핎서만 상태에 듀얎갈 수있는 겜우 소멞자는 핎당 상태에있는 겜우 삭제되Ʞ 전에 고정되었닀고 가정 할 수 있습니닀.

윔드는 비 로컬 소멞자가 구성원을 읎동하지 않는닀고 가정 할 수 없지만 분명히 자신의 소멞자가 구성원을 작성하Ʞ 때묞에 읎동하지 않는닀고 가정 할 수 있습니닀.

"never moved until drop"읎띌고 말하멎 & mut self가 Pin <& mut Self>의 죌소에서 읎동 한 곳에서 Drop읎 혞출 될 수 있음을 의믞합니닀. 소멞자는 정확한 낎부 포읞터에 의졎 할 수 없습니닀.

슉, drop 가 혞출 될 때까지 데읎터가 읎동하지 않습니닀 (할당 핎제되지 않는 것을 포핚하여 닀륞 곳윌로 읎동하지 않는닀는 의믞). 귞늬고 예, drop 는 유형읎 귞것을 표현할 수 없더띌도 고정 된 위치에서 싀행에 의졎 할 수 있습니닀. drop 은 ( 는) Pin<&mut self> (몚든 유형에 대핮)륌 받아알 하지만 아쉜게도 너묎 늊었습니닀.

drop 가 혞출 된 후 데읎터는 의믞가없는 바읎튞읎므로 ì–Žë–€ 작업도 수행 할 수 있습니닀. 거Ʞ에 새 항목을 넣고 할당을 췚소합니닀.

예륌 듀얎 요소의 소멞자가 읞접한 포읞터륌 조정하여 등록을 췚소하는 칚입 링크 목록을 허용합니닀. 소멞자가 혞출되지 않윌멎 메몚늬가 사띌지지 않을 것입니닀. (요소는 여전히 유출 될 수 있윌며 ê·ž 연결 목록에 영원히 낚아있을 것입니닀. 귞러나읎 겜우 유횚한 메몚늬로 ë‚šì•„ 있윌므로 안전 묞제가 없습니닀.)

저는 Pin , Unpin 에서 찟을 수있는 몚든 낎용을 읜었윌며 읎에 대한 녌의도 _ 생각합니닀 _ 읎제 묎슚 음읎 음얎나고 있는지 읎핎합니닀. 닀륞 유형의 의믞와 구현 자와 사용자가 따띌알하는 계앜에 대한 믞묘핚 안타깝게도 std::pin 또는 Pin 및 Unpin 에 대한 묞서에서 읎에 대한 녌의가 비교적 적습니닀. 특히 닀음 댓Ꞁ의 ë‚Žìš© 쀑 음부륌볎고 싶습니닀.

묞서에 통합되었습니닀. 구첎적윌로 특별히:

  • ê·ž Pin 는 "한 닚계 깊읎"만 볎혞합니닀.
  • Pin::new_unchecked 는 Deref 및 DerefMut 에 대한 impl에 제한을 둡니닀.
  • Pin 및 Drop 간의 상혞 작용.
  • !Unpin 는 Pin 배치 된 후에
  • Pin<Box<T>>: Unpin where T: !Unpin 읎유에 대한 귌거. 읎는 위의 "1 닚계 깊읎"제한곌 닀시 연결되지만 적절한 섀명읎 포핚 된읎 구첎적읞 예가 독자에게 도움읎 될 것읎띌고 생각합니닀.

@alexcrichton 의 반례도 ꜀ 유용하닀는 것을 unsafe 방법에 대핮 묎엇읎 잘못 될 수 있는지에 대한 아읎디얎륌 제공하멎 많은 도움읎 될 것읎띌고 생각합니닀 (적얎도 확싀히 저에게 도움읎되었습니닀). 음반적윌로읎 API의 믞묘핚윌로 읞핎 닀양한 안전하지 않은 메서드의 안전성 섹션읎 확장되고 std::pin 몚듈 수쀀 묞서에서 ì°žì¡° 될 수도 있습니닀.

나는 아직읎 API륌 많읎 사용하지 않았Ʞ 때묞에 지ꞈ은 좋은 상태에 있닀는 Ʞ술적 판닚을 믿을 것입니닀. 귞러나 Pin , Pinned 및 Unpin 은 맀우 닀륞 유형 / 특성 및 비교적 복잡한 API에 대핮 너묎 유사하고 표현력읎 없얎서 읎핎하Ʞ가 더 얎렀워집니닀. (읎 슀레드에 대한 몇 가지 의견윌로 입슝 됚).

귞듀은 마컀 특성에 대한 명명 규칙을 따륎는 것 같아서 싀제로 불평 할 수는 없지만 장황핚곌 자Ʞ 섀명 읎늄 사읎의 균형을 맞출 수 있는지 궁ꞈ합니닀.

  • Pinned - Pin 와 같은 닚얎읎Ʞ 때묞에 닀소 혌란 슀럜습니닀. PhantomData 와 같읎 사용하멎 귞렇지 않윌멎 누띜 될 메타 정볎로 구조첎륌 볎강 할 수 있습니닀. PinnedData , PhantomPinned , PhantomSelfRef 또는 DisableUnpin ? 사용 팹턮 및 / 또는 ê·žë¡œ 읞한 영향을 나타낮는 것.
  • Unpin - 등의 https://github.com/rust-lang/rust/issues/55766#issuecomment -437266922, 나는 읎늄윌로 혌동하고있얎 Unpin , 때묞에 "유엔 핀 "는 여러 몚혞한 방식윌로 읎핎할 수 있습니닀. IgnorePin , PinNeutral 거요?

음반적윌로 나는 싀팚하고 있지만 좋은 대첎 읎늄을 찟는 쀑입니닀 ...

PhantomPin곌 PinNeutral은 특히 멋진 읎늄윌로 저륌 공격합니닀.

대위법을 제공하Ʞ 위핎 Unpin 직ꎀ적 읞 것을 발견했습니닀 (읎핎 한 후에는). Pinned 은 낮 자신의 윔드에서 사용하지 않았Ʞ 때묞에 똑바로 유지하Ʞ가 더 얎렵습니닀. Pinned 륌 NotUnpin 얎떻습니까?

나는 더 나은 읎늄을 찟는 것읎 더 쉜게 읎알Ʞ 할 수 있도록하는 목적윌로 자전거 흘늬Ʞ 욎동읎 가치가 있닀는 데 동의합니닀. ë‚Žê°€ 제안:

  • Pin -> Pinned : Pin 받윌멎 죌얎진 낎용읎 _ 고정되었윌며 _ 영원히 _ 유지 _ 될 것읎띌는 앜속입니닀. 나는 읎것에 대핮 너묎 강하게 느끌지 않는닀. 당신읎 "가치의 핀"을받는 것에 대핮 읎알Ʞ 할 수도 있Ʞ 때묞읎닀. Pinned<Box<T>> 은 나에게 더 좋게 읜습니닀. 특히 Box 만 고정되얎 있고 포핚 된 낎용읎 아닙니닀.
  • Unpin -> Repin : 닀륞 마컀 특성의 겜우 음반적윌로 핎당 마컀 특성을 가진 것윌로 할 수있는 작업에 대핮 읎알Ʞ합니닀. 읎것읎 아마도 Unpin 읎 처음에 선택된 읎유 Unpin 것을 고정한 닀음 결곌 나 고렀없읎 닀륞 곳에 닀시 고정 할 수 있닀는 것입니닀. 좀 더 장황하지만 @ mark-im의 PinNeutral 제안도 마음에 듭니닀.
  • Pinned -> PermanentPin : Pinned 가 좋은 읎늄읎띌고 생각하지 않습니닀. Pinned 가 포핚 된 항목은 싀제로 고정되지 않았Ʞ 때묞입니닀. Unpin 아닙니닀 . PhantomPin 는 Pin 가 싀제로 원하는 것읎 아닌 Pin 찞조한닀는 점에서 유사한 묞제가 있습니닀. NotUnpin 에는 읎쀑 부정읎있얎서 추론하Ʞ 얎렵습니닀. @Kimundi 의 PhantomSelfRef 제안은 ꜀ 가까워졌지만 여전히 앜간 "복잡하닀"ê³  생각하고 "한 번 고정하멎 읎동할 수 없음"속성을 한 읞슀턎슀 와 연결합니닀 ( 자Ʞ ì°žì¡°ê°€ 있습니닀). 낮 제안은 PermanentlyPinned 로 표현 될 수도 있습니닀. 나는 ì–Žë–€ 형태가 덜 나쁜지 몚륎겠습니닀.

Pinned 은 ê²°êµ­ NotX 가되얎알한닀고 생각합니닀. X 는 Unpin 가 읎늄읎 붙는 읎늄입니닀. Pinned 의 유음한 작업은 둘러싞는 유형읎 Unpin 구현하지 않도록 만드는 것입니닀. (펞집 : 귞늬고 우늬가 Unpin 륌 닀륞 것윌로 바꟞고 있닀멎 아마도 읎쀑 부정은 묞제가되지 않을 것입니닀)

"읎 유형은 닀륞 곳에 고정 될 수 있음"은 "읎 유형은 핀에서 읎동할 수 있음"의 부작용 음 뿐읎므로 Repin 은 읎핎가되지 않습니닀.

@tikue ì–Žë–€ 의믞에서 나는 똑같은 느낌읎 듀지만 반대로. Unpin 은 "this is _not_ constrained by Pin "로 표현되얎알하고 Pinned 는 "this _is_ constrained by Pin "로 표현되얎알한닀고 생각합니닀. s/Unpin/TemporaryPin , s/Pinned/PermanentPin ?

펞집 : 예, Repin 가 Unpin 의 부작용 읞 것에 대한 귀하의 요점을 뎅니닀. Pin 는 Unpin 읞 유형에 대핮 "쀑요하지 ì•Šë‹€"는 사싀을 전달하고 싶었습니닀. Unpin 읎 (가) 맀우 잘 작동한닀고 생각하지 않습니닀. 따띌서 위의 제안 TemporaryPin .

@jonhoo 나는 ê·ž 반대륌 선혞하는 죌된 읎유는 Pinned 읎 특성읎 구현되는 것을 막Ʞ 때묞읎띌고 생각합니닀. 슉, 나에게 가장 명백한 의믞에서 진정한 부정적입니닀.

펞집 : 얎떚까요?

Unpin -> Escape
Pinned -> NoEscape

흥믞 ë¡­ 넀요 .. 묞서에 얎떻게 듀얎가는 지 알아 볎렀고합니닀. 닀음곌 같은 것 :

음반적윌로 Pin<P> 받윌멎 P 의 대상읎 삭제 될 때까지 읎동하지 않는닀는 볎장곌 핚께 제공됩니닀. 읎에 대한 예왞는 P 의 목표가 Escape 입니닀. Escape 로 표시된 유형은 읎동하더띌도 (예 : 낎부 자첎 ì°žì¡°ê°€ 포핚되지 않음) 유횚하닀고 앜속하므로 Pin 륌 "읎슀쌀읎프"할 수 있습니닀. Escape 는 자동 튞레읎 튞읎므로 Escape 읞 유형윌로 완전히 구성된 몚든 유형도 Escape 입니닀. 구현자는 NoEscape impl !Escape for T {} 륌 사용하거나 std::phantom 의 NoEscape 마컀륌 포핚하여 알간에읎 Ʞ능을 옵튞 아웃 할 수 있습니닀.

"탈출"읎띌는 닚얎와의 연결읎 앜간 앜핎 볎읎지만 ꜀ ꎜ찮은 것 같습니닀. 별도로 위의 낎용을 작성하멎 Pin<P> 가 P 의 대상읎 읎동되지 않는닀는 것을 _ 정말 _ 볎장하지 않는닀는 것을 깚달았습니닀 (정확히 Unpin 때묞에). 대신, _ either_ P 의 대상읎 읎동하는지 _or_ P 의 대상읎 읎동되지 않는지 여부는 쀑요하지 않음을 볎장합니닀. 귞래도 더 나은 읎늄 선택을 알늬Ʞ 위핎 귞것을 사용하는 방법을 몚륎겠습니닀 ... 귞러나 귞것은 아마도 묞서에 ì–Žë–€ 식 윌로든 귞것을 만듀얎알 할 것입니닀.

개읞적윌로 나도 읎늄윌로 Unpin 륌 싫얎합니닀. 아마도 impl !Unpin 로 자죌 볎읎지만 "not-un-pin"읎띌고 읜고 몇 번의 두뇌 사읎큎읎 필요하Ʞ 때묞음 것입니닀. '읎전 몚덞 임)은 "좋아요. 처음 고정되멎 영원히 고정 될 것입니닀."띌는 결론을 낮멮 수 있윌므로 읎쀑 넀거티람륌 최적화 할 수도 없습니닀.
음반적윌로 읞간은 Ɥ정 대신 부정적읞 생각을하는 겜향읎 있습니닀 (직접 출처없읎, 의심슀러욎 겜우 Richard Hudson의 작업을 확읞하십시였).
Btw Repin 정말 좋넀요.

Pin 는 고정 된 값을 항상 고정 된 값윌로 만듀지 ì•Šêž° 때묞에 섀명하Ʞ 얎렵습니닀. Pinned 는 싀제로 아묎것도 고정하지 ì•Šêž° 때묞에 혌란 슀럜습니닀. 귞것은 닚지 Pin 읎슀쌀읎프륌 방지합니닀.

Pin<P<T>> 는 고정 된 값윌로 섀명 할 수 있습니닀. 고정 된 값은 값읎 핀을 ë²—ì–Žë‚  수있는 유형읎 아니멎 읎동할 수 없습니닀.

빠륞 읞터넷 검색은 레슬링에서 핀읎 고정 될 때 핀에서 ë¹ ì ž 나가는 것을 탈출읎띌고 합니닀.

나는 또한 Unpin 대신 읎슀쌀읎프띌는 용얎륌 좋아하지만 EscapePin 합니닀.

여Ʞ에 많은 좋은 생각읎 있습니닀!

한 가지 음반적읞 사항 : 몚국얎가 아닌 저에게 Pin 및 Unpin 는 대부분 동사 / 동작입니닀. Pin 은 의믞가 있지만 객첎는 한 번에 하나의 메몚늬 위치에 고정되얎 있윌므로 Unpin 대핮 동음한 위치륌 볌 수 없습니닀. Pin<&mut T> 찞조륌 받윌멎 Unpin 여부에 ꎀ계없읎 항상 메몚늬 위치가 안정적읎띌는 의믞로 T가 고정됩니닀. 싀제로 개첎륌 작업윌로 고정 í•Žì œ 할 수 없습니닀. 찚읎점은 Unpin 유형은 추가 상혞 작용에서 유지하Ʞ 위핎 고정 볎장읎 필요하지 않닀는 것입니닀. 귞것듀은 자Ʞ ì°žì¡°ê°€ 아니며 귞듀의 메몚늬 죌소는 예륌 듀얎 닀륞 객첎로 볎낎지지 않고 거Ʞ에 저장되지 않습니닀.

Unpin 싀제로 의믞하는 바에 대핮 놀띌욎 작업을하는 것읎 좋겠닀는 @tikue의 의견에 동의하지만 정량화하Ʞ는 얎렵습니닀. 귞러한 유형읎 순전히 움직음 수 있닀는 것읎 아니띌 순전히 자Ʞ ì°žì¡° 성읎 부족한 것도 아닙니닀. 아마도 "객첎가 읎동 될 때 전첎 메몚늬 공간의 포읞터가 묎횚화되지 않는닀"는 것입니닀. 귞런 닀음 StableOnMoveAfterPin 또는 StableMove 것읎 옵션읎 될 수 있지만 ê·ž 또한 좋지 않은 것 같습니닀.

나륌 위핎 Repin 는 Unpin 와 동음한 합병슝을 가지고 있습니닀. 슉, 한 가지가 뚌저 고정 핎제된닀는 것을 의믞합니닀. 낮 읎핎로는 발생하지 않습니닀.

특성은 대부분 유형의 Pin 륌 볞 후 발생하는 음을 정의하Ʞ 때묞에 PinNeutral 또는 PinInvariant 것읎 나쁘지 않습니닀.

Pin vs Pinned 와 ꎀ렚하여, 나는 귞것을 볎는 시점의 포읞터 상태읎Ʞ 때묞에 Pinned 선혞한닀고 생각합니닀.

@ Matthias247 P: Unpin 겜우 P::Target 의 죌소가 안정적읎띌는 볎장읎 없닀고 생각합니닀. 나는 읎것에 대핮 틀멮 수 있습니까?

안녕하섞요.

Pin <& mut T>에 대한 찞조륌 받윌멎 고정 í•Žì œ 여부에 ꎀ계없읎 항상 메몚늬 위치가 안정적읎띌는 의믞로 T가 고정됩니닀.

읎것의 의믞륌 명확히 할 수 있습니까? T: Unpin 죌얎지멎 닀음을 작성할 수 있습니닀.

let pin_t: Pin<&mut T> = ...
let mut other_t: T = ...
mem::replace(Pin::get_mut(pin_t), &mut other_t);
// Now the value originally behind pin_t is in other_t

@jonhoo 싀제로 좋은 질묞입니닀. 낮 추론은 선묌읎 상자에 듀얎간 닀음 poll() 메서드가 동음한 메몚늬 죌소에서 혞출된닀는 것입니닀. 귞러나 읎것은 분명히 최상위 수쀀의 작업 / 믞래에만 적용되며 쀑간 계잵은 Unpin 때 선묌을 읎동할 수 있습니닀. 귞래서 당신읎 옳은 것 같습니닀.

최신 자전거 흘늬Ʞ :

  • Unpin : MoveFromPin 얎떻습니까? 여전히 앜간의 믞묘핚을 놓치고 있지 않닀멎 읎것읎 특성읎 싀제로 활성화하는 Ʞ능을 직접적윌로 섀명한닀고 생각합니닀. 유형읎 Pin 낎에 있윌멎 여전히 읎동할 수 있습니닀.

    결정적윌로 귞것은 Unpin 곌 같은 것을 말합니닀. 귞러나 Ɥ정적 읞 죌장윌로 틀을 잡았습니닀. 귞래서 읎쀑 부정 !Unpin 대신에 !MoveFromPin 있습니닀. 나는 귞것읎 핎석하Ʞ 더 쉜닀고 생각한닀. 적얎도 ... 귞것은 ì–Ž, 당신읎 핀에서 옮Ꞟ 수없는 타입듀읎닀.

    (Ʞ볞 아읎디얎에는 앜간의 변형 여지가 있습니닀 : MoveOutOfPin , MoveFromPinned , MoveWhenPinned 등)

  • Pinned : 귞러멎 NoMoveFromPin 가 될 수 있윌며 ê·ž 횚곌는 !MoveFromPin 유형을 만드는 것입니닀. 충분히 ê°„ë‹š 핮 볎읞닀고 생각합니닀.

  • Pin 자첎 : 읎것은 닀륞 두 개와 연결되얎 있지 않고 귞닀지 쀑요하지 않지만 여Ʞ에서도 앜간의 개선의 여지가 있닀고 생각합니닀.

    묞제는 Pin<&mut T> (예륌 듀얎)가 &mut 가 고정되었음을 의믞하는 것읎 아니띌 T 가 (ë‚Žê°€ 볞 것 같은 혌란 적얎도 하나의 최귌 의견 슝거). Pin 부분은 &mut 에 대한 음종의 수정 자 역할을하므로 Pinning 띌고 부륎는 것읎 더 나은 겜우가 있닀고 생각합니닀.

    읎 몇 가지 간접적 읞 선례가있닀 : 우늬가 대신 공포의 죌위에 래핑하는 정수형의 였버 플로우 의믞륌 수정하렀멎, 우늬는 말할 Wrapping<i32> 볎닀는 Wrap<i32> .

읎것듀은 몚두 원볞볎닀 Ꞟ지만, 읎것에 대한 추론읎 얌마나 섬섞한지륌 고렀할 때 더 명확성을 위핎 가치있는 투자가 될 수 있습니닀.

Re : Repin , 닀음곌 같을 것윌로 예상합니닀.

unsafe trait Repin {
    unsafe fn repin(from: *mut Self, to: *mut Self);
}

가끔 윘텐잠륌 읎동하는 Vec -like 컬렉션 낎에서 !Unpin 유형을 지원하는 데 사용할 수 있습니닀 (읎는 읎러한 특성을 추가하Ʞ위한 제안읎 아닙니닀. 특성 읎늄).

또한 읎늄을 bikshedding :

  • Pin<P> -> Pinned<P> : 포읞터 P 가늬킀는 값읎 메몚늬에 고정됩니닀 (삭제 될 때까지).
  • Unpin -> Moveable : 값을 고정 할 필요가 없윌며 자유롭게 읎동할 수 있습니닀.
  • Pinned (struct)-> Unmoveable : Pinned 읎얎알하며 읎동할 수 없습니닀.

나는 Pin 또는 Unpin 가 변겜되얎알한닀고 생각하지 않윌며, 대안은 몚두 낮 의견에 명확하지 않고 자섞한 낎용을 추가하거나 였핎의 소지가 있습니닀. 또한 우늬는 읎믞읎 대화륌했고 Pin 및 Unpin 륌 사용하Ʞ로 결정했윌며읎 슀레드에서 가젞옚 읞수 쀑 ì–Žë–€ 것도 새로욎 것읎 아닙니닀.

귞러나 Pinned 는 읎전 녌의 읎후 추가되었윌며 PhantomData 와 같은 팬텀 마컀 유형을 지우렀멎 PhantomPinned 륌 만드는 것읎 합늬적읎띌고 생각합니닀.

개읞적윌로 나도 Unpin을 읎늄윌로 사용하는 것을 맀우 싫얎합니닀. 아마도 귞것읎 "not-un-pin"읎띌고 읜고 결론을 낎늬Ʞ 위핎 몇 번의 두뇌 사읎큎을 필요로하는 impl! "좋아요. 읎걎 처음 고정되멎 영원히 고정 될 것입니닀."띌는 뜻입니닀. 귞래서 읎쀑 부정을 최적화 할 수도 없습니닀.

읎것은 낮 겜험곌 완전히 반대입니닀. !Unpin 수동윌로 구현한닀는 것은 맀우 틈새 시장 읞 안전하지 않은 윔드륌 사용하여 수동윌로 자첎 ì°žì¡° 구조륌 구현한닀는 것을 의믞합니닀. 반대로, 포읞터 뒀에 잠재적윌로 고정 í•Žì œ 된 구조첎륌 유지하는 몚든 것은 Unpin 의 양의 impl을 갖습니닀. 예륌 듀얎 std 에서 Unpin 의 몚든 impls는 양의 극성입니닀.

@withoutboats 여Ʞ에 제Ʞ 된 녌쟁읎 읎믞 녌의 된읎 읎늄듀에 대한 읎전 녌의에 대한 링크륌 제공 할 수 있습니까?

RFC 슀레드 및 추적 묞제 https://internals.rust-lang.org/t/naming-pin-anchor-move/6864 에서도 확싀히 녌의되었지만 닀음은 슀레드 하나입니닀.

(읎 슀레드의 앵컀 및 핀 유형은 읎제 Pin<Box<T>> 및 Pin<&'a mut T> )

Unpin은 Unpinnable의 앜자로 읜혀알합니까? 핀 낎부에 있더띌도 싀제로 고정 된 값을 유지할 수 없Ʞ 때묞에 고정 할 수 없습니닀. (귞게 낮 부분에 대한 올바륞 읎핎입니까?)

음부 묞서 및 댓Ꞁ 슀레드륌 삎펎 볎았지만 Unpinnable에 대한 찞조는 특별히 볎지 못했습니닀.

고정 핎제는 묎엇읎든 쀄여서는 안됩니닀. ë‚Žê°€ 생각하는 한 가지는 많은 사용자에게 분명하지 않지만 사싀입니닀. 표쀀 띌읎람러늬 슀타음 가읎드는 형용사가 아닌 특성 읎늄윌로 동사륌 선혞한닀는 것입니닀. 따띌서 Sendable 아니띌 Send Sendable . 읎것은 완벜한 음ꎀ성윌로 적용되지 않았지만 표쀀입니닀. Unpin 는 고정한 Pin 에서읎 유형을 고정 í•Žì œ 할 수 있윌므로 "고정 í•Žì œ"와 같습니닀.

같은 읎늄 Move ( "읎동"하지 êž°ì–µ)륌볎닀 명확 Unpin 귞듀읎 였히렀에 동작을 연결하는 것볎닀, 전혀 읎동할 수있는곌 ꎀ렚읎 있닀는 것을 의믞하Ʞ 때묞에 핀 유형. Rust에서 Sized 값을 읎동할 수 있Ʞ 때묞에 !Unpin 유형을 읎동할 수 있습니닀.

ë‚Žê°€ 볞 것처럌 전첎 묞구 읞 읎늄은 std에 대핮 맀우 닚ꎀ적음 것입니닀.

짧지 않을 수도 있지만 정확히 ë‚Žê°€ 읜는 방법입니닀. 특성은 동사읎Ʞ 때묞에 유형에 대한 연산읎 아닌 유형을 섀명하는 데 사용하렀멎 수동윌로 형용사로 변환핎알합니닀. std::iter::Iterator 는 반복 가능한 묎얞가에 의핎 구현되고, std::io::Seek 는 검색 가능한 묎얞가에 의핎 구현되고, std::pin::Unpin 는 고정 불가능한 묎얞가에 의핎 구현됩니닀.

@withoutboats 동사 묞제가없는 닀륞 읎늄의 특정 묞제, 예륌 듀얎 Escape 또는 EscapePin ? 읎 토론읎 읎전에 음얎났닀는 것을 읎핎했지만 지ꞈ은 더 많은 시선읎 집쀑되얎 있윌므로 완전히 쀑복 된 재핎시읞지 확싀하지 않습니닀.

나는 사싀 생각 한가지는 자사의 불욎읎 Pin 및 Unpin (ì–Žë–€ 종류의 "핀"읎며, 음부는 "고정 í•Žì œ"읎닀) 한 쌍윌로 읜을 수, 겜우 Pin 는 동사가 아닌 명사 여알합니닀. Pin 읎 특성읎 아니띌는 사싀읎 상황을 명확히 핎쀍니닀. Pinning 에 찬성하는 죌장은 타당하지만 여Ʞ서는 읎늄 Ꞟ읎 묞제에 맞서게됩니닀. 방법 수신Ʞ륌 반복핎알합니닀 특히 때묞에 self : 두 번, 우늬는 묞자의 많은 끝낌 self: Pinning<&mut Self> . Pinning<P> 읎 Pin<P> 볎닀 명확 할 가치가있는 전첎 4 자띌는 것을 확신하지 못합니닀.

@tikue "탈출"용얎는 ë‚Žê°€ 생각하는 고정볎닀 훚씬 더 곌부하되얎 탈출 분석곌 같은 개념곌 충돌합니닀.

또한 우늬는 읎믞읎 대화륌했고, Pin곌 Unpin을 사용하Ʞ로 결정했고,읎 슀레드에서 제Ʞ 된 ì–Žë–€ 죌장도 새로욎 것읎 아닙니닀.

읎것은 저륌 잘못된 방식윌로 묞지늅니닀. 컀뮀니티의 겜험 볎고서가 원하지 않습니까? 개읞적윌로읎 슀레드의 닀륞 댓Ꞁ곌 Pinned 읎쀑 넀거티람와의 병치에서 Unpin 대한 명확한 묞제륌 볎지 못했습니닀.

Rust는 읎슀쌀읎프 분석을 수행하지 않윌므로 읎것읎 싀제 묞제띌고 생각하지 않습니닀.

: bell : 지ꞈ은 위 의 에 따띌 최종 댓Ꞁ Ʞ간을 입력합니닀 . :벚:

읎 땅에 도달하Ʞ 전에 https://github.com/rust-lang/rust/issues/55766#issuecomment-438316891에 섀명 된대로 묞서 개선 사항을볎고 싶습니닀. :)

https://github.com/rust-lang/rust/pull/55992 륌 ì—Žì–Ž 위에 제안 된 묞서륌 추가하고 Pinned 을 PhantomPinned .

Pinned (및 PhantomPinned )는 "고정 된"값을 Pin 밖윌로 읎동할 수없는 것윌로 개념화하도록 장렀합니닀. 슉, Pin 에있는 많은 값을 의믞합니닀. Unpin )는 "고정" 되지 않습니닀 !

혌란슀러워 볎입니닀. Pin 몚든 값읎 Pin 에있는 동안 고정 된 것윌로 개념화하는 것읎 더 쉬우 ë©° 고정되는지 여부는 읎전에 Pinned 읎띌는 읎늄읎 영구적 읞지 여부입니닀 Pinned 컚튞례. Pin* 와 닀륞 읎늄은 두 개의 닀륞 개념읎 혌동되는 것을 방지합니닀.

PhantomNotUnpin : P

개읞적윌로 나도 Unpin을 읎늄윌로 사용하는 것을 싫얎합니닀. 아마도 impl! Unpin읎 "not-un-pin"읎띌고 읜고 여러 뇌죌Ʞ륌 필요로하Ʞ 때묞음 것입니닀.

감사! 나는 또한 ꜀ 였랫동안 Unpin 에 의핎 귀찮게 뎇읎 ê·ž 읎유륌 정확히 지적 할 수 없었습니닀. 읎제 나는 읎핎한닀고 생각합니닀. 귞것은 읎쀑 부정입니닀.

읎것은 낮 겜험곌 완전히 반대입니닀. 수동윌로! Unpin을 구현한닀는 것은 맀우 틈새 시장 읞 사용 사례 읞 안전하지 않은 윔드륌 사용하여 수동윌로 자첎 ì°žì¡° 구조륌 구현한닀는 것을 의믞합니닀. 반대로, 포읞터 뒀에 잠재적윌로 고정 í•Žì œ 된 구조첎륌 유지하는 몚든 것은 Unpin의 양의 impl을 갖습니닀. 예륌 듀얎 표쀀에서 Unpin의 몚든 impls는 양의 극성입니닀.

귞러나 구현뿐만 아니띌 토론에 ꎀ한 것입니닀. impl !Sync 은 맀우 드묌지만 (불안정하Ʞ 때묞에 혌자가 아닙니닀) Sync 및 !Sync 유형에 대핮 읎알Ʞ하는 것은 맀우 음반적입니닀. 비슷하게, !Unpin 는읎 Ʞ능에 대한 녌의에서 상당히 많읎 나왔는데, 적얎도 제가 가지고 있었던 것입니닀.

저도 속성을 Ɥ정적윌로 표현하는 것을 선혞합니닀 ( MoveFromPin 정도). 나는 읞간 공학에 완전히 확신하지 못합니닀. Pin 와는 달늬읎 특성 겜계륌 자죌 ì“ž 필요가 없Ʞ 때묞입니닀.

Rust는 읎슀쌀읎프 분석을 수행하지 않윌므로 읎것읎 싀제 묞제띌고 생각하지 않습니닀.

LLVM은 귞렇Ʞ 때묞에 읎슀쌀읎프 분석은 여전히 ​​Rust와 ꎀ렚읎 있습니닀.

읎륌 핎결하는 방법은 Pin / Unpin 의 의믞륌 뒀집는 닚얎륌 선택하는 것입니닀. 예륌 듀멎, 읎늄을 변겜 Unpin 에 Relocate . 귞러멎 !Unpin 는 !Relocate 됩니닀. 귞것은 나에게 훚씬 더 직ꎀ적 읞 의믞가 있습니닀. "였,읎 유형의 개첎는 재배치 할 수 없습니닀"띌고 읜었습니닀. 또 닀륞 겜쟁자는 Movable 입니닀.

Pin 대첎 할 수있는 반대 ë‹šì–Žê°€ 묎엇읞지, 아니멎 필요한지 몚륎겠습니닀. 귞러나 나는 묞서가 닀음곌 같읎 말하는 것을 확싀히 상상할 수 있습니닀.

고정 된 개첎는 개첎륌 메몚늬에 재배치 할 수있는 겜우에만 DerefMut 륌 통핎 직접 수정할 수 있습니닀. Relocate 는 자동 튞레읎 튞읎며 Ʞ볞적윌로 추가됩니닀. 귞러나 값을 볎유하는 메몚늬에 대한 직접 포읞터가있는 겜우 유형에 impl !Relocate 륌 추가하여 Relocate 에서 옵튞 아웃합니닀.

impl<T: Relocate> DerefMut for Pin<T> { ... }

읎것은 Unpin 볎닀 훚씬 더 직ꎀ적입니닀.

위에서 제안한 묞서륌 추가하Ʞ 위핎 # 55992륌 엎었습니닀.

읎것은 https://github.com/rust-lang/rust/issues/55766#issuecomment -438316891에서 제안 된 것의 음부만 추가합니닀.

MoveFromPin 제안읎 마음에 듭니닀. Relocate 도 좋지만 Pin 와 (곌) ꎀ렚읎 충분하지 않을 수 있습니닀. 읎동 불가능한 유형윌로 닀시 읎핎할 수 있습니닀. RelocateFromPin 가 닀시 좋을 것입니닀.

Escape ing은 예륌 듀얎 Swift에서 큎로저와 ꎀ렚읎 있윌며 현재 윜 첎읞 낎부 또는 왞부에서 혞출되는지 여부입니닀. 였핎의 소지가있는 것 같습니닀.

명확성을 돕는 한 ꞎ 읎늄의 묞제는 볎읎지 않습니닀.

FWIW 투표륌 통핎 Unpin 읎늄을 Relocate 또는 MoveFromPin 와 같은 "Ɥ정적 읞"읎늄윌로 바꟞고 싶습니닀 (또는 더 장황하지만 앜간 더 정확한 MayMoveFromPin ).

!Unpin 또는 Unpin 의 읎쀑 부정읎 역사적윌로 저에게 혌란 슀러웠고 Ɥ정적 읞 "읎것은 Pin 안에 있음에도 불구하고 움직음 수 있습니닀"띌는 점에 동의합니닀. 혌란을 덜얎 쀄 것입니닀!

FWIW 처음에는 Unpin 에 대핮 똑같은 생각을했지만 싀제로 IMO륌 사용하렀고했을 때 의믞가있었습니닀. 찟고있는 작업읎 Unpin Ʞ능읎Ʞ 때묞에 싀제로 읎쀑 부정읎 아닙니닀 Pin 자유롭게 듀얎였고 나가Ʞ)는 묌걎을 고정하는 능력읎 아닙니닀. MoveFromPin 와 동음하며 닀륞 닚얎로만 표시됩니닀. 나는 사람듀읎 " Pin "같은 것읎 아니띌고 생각하게 만듀지 않는 읎늄을 선혞하지만 IMO MoveFromPin 와 닀륞 사람듀은 너묎 말읎 많닀. UndoPin ? (haskell 군쀑을 위핎 FreePin ?)

나는 아직도 !Unpin 읎상하닀고 생각한닀 – 나는 낎멎의 목소늬륌 "읎걞 풀지 마!"처럌 췚꞉하도록 훈렚시쌰닀. 음반적읞 " Unpin 구현하지 않음"대신 앜간의 녞력읎 필요합니닀.

!Pluck 얎떻습니까?

@runiq

음반적읞 "고정 핎제륌 구현하지 않음"대신

읎전 의견에서 읎것을 얞꞉했지만 싀제로는 읎것읎 좋은 표현읎띌고 생각합니닀. Unpin 은 Pin<C<_>> 륌) 듀얎였고 나가는 작업입니닀. Unpin 구현하지 않는 것은 귞러한 Ʞ능을 제공하지 않습니닀.

@cramertj 저는 UndoPin 아죌 좋아합니닀

@cramertj 나는 지ꞈ까지 제안 된 대안의 엎렬한 팬읎 아니띌는 데 동의하지만, 개읞적윌로 MoveFromPin 볎닀 Unpin MoveFromPin 띌는 닚얎륌 선혞합니닀. 읎쀑 부정읎 아니띌는 것읎 좋은 점읎지만 (아직 음하지 않은 사람윌로서) 귞것을 읜윌멎 읎쀑 부정읎띌는 사싀읎 계속핎서 나륌 ꎎ롭 힙니닀. "Un"접두사륌 음수로 계속 읜윌렀고합니닀 ...

혞Ʞ심읎 많지만 @cramertj 또는 닀륞 사람듀은 Unpin 바읞딩읎 읞첎 공학적윌로 얌마나 많읎 나였는지에 대한 좋은 핞듀읎 있닀고 생각합니까? 맀우 희귀합니까? 맀우 흔한가요? 타읎핑하는 것읎 고통 슀럜닀멎 고통 슀러욞 정도로 흔한가요?

짧고 달윀한 읎늄의 겜우 개읞적윌로 Relocate 아읎디얎가 마음에 듀지만, 더 êžžê³  ë‹šì–Žê°€ 더 많은 아읎디얎의 겜우에는 MoveFromPin 좋아합니닀. Unpin 볎닀 낫닀고 느낍니닀.

혞Ʞ심읎 많지만 @cramertj 또는 닀륞 사람듀은 나였는지에 대한 좋은 핞듀읎 있닀고 생각합니까? 맀우 희귀합니까? 맀우 흔한가요? 타읎핑하는 것읎 고통 슀럜닀멎 고통 슀러욞 정도로 흔한가요?

낮 겜험상 Unpin 싀제로 사용자 윔드에 나타나는 두 가지 겜우가 있습니닀.

  1. 폎링 할 때 싀제로 믞래륌 움직여알하Ʞ 때묞에 Unpin 겜계 가 나타납니닀 (예 : 음부 API 선택).
  2. 더 음반적윌로, 믞래가 믞래가 아닌 닀륞 것에 대핎서만 음반적읞 겜우 음반적윌로 Unpin 의 묎조걎 구현 을 추가하렀고합니닀. 닀륞 유형읎 Unpin 읞지 여부는 쀑요하지 ì•Šêž° 때묞입니닀. 귞듀에게 프로젝튞륌 고정하십시였.

두 번짞 겜우의 예는 음반적읞 버퍌 유형 (예 : T: AsRef<[u8]> )읎있는 겜우입니닀. 슬띌읎슀륌 꺌낎Ʞ 위핎 고정 할 필요가 없윌므로 Unpin 구현 여부는 신겜 쓰지 않윌므로 유형읎 묎조걎 Unpin 구현한닀고 말하멎 구현할 수 있습니닀. Future 고정 묎시.

Unpin 는 겜계로 볎는 것읎 맀우 음반적입니닀. select! , StreamExt::next 및 Ʞ타 결합자는 몚두 작동하는 유형읎 Unpin 읎얎알합니닀.

@withoutboats 나는 당신의 요점 2에 대핮 궁ꞈ합니닀. impl Unpin 가 사람듀읎 자죌 구현하는 것을 Ʞ억핎알 할 것읎띌고 생각합니까? 였늘날 띌읎람러늬 작성자가 사용자 지정 형식에 대핮 #[derive(Debug)] 또는 impl std::error::Error 륌 잊얎 버늬는 것곌 비슷하여 읎러한 띌읎람러늬륌 사용하Ʞ가 더 얎렵습니까?

고정 핎제는 자동 특성입니닀. 고정 핎제륌 구현하지 않는 유형을 갖게되는 유음한 겜우는 핎당 유형읎 명시 적윌로 옵튞 아웃하는 겜우입니닀. (또는 고정 핎제륌 핎제하는 필드가 포핚되얎 있습니닀).

나는 귞것읎 사싀임을 읎핎합니닀. 귞늬고 저는 귞것읎 가장 음반적읞 겜우띌고 생각했습니닀. 귞래서 @withoutboats 가 두 번짞 요점을 얞꞉ 한 것에 놀랐습니닀. 귞것은 ë‚Žê°€ 원래 생각했던 것볎닀 더 흔할 수 있닀는 것을 암시합니닀 (아마도 자신의 믞래륌 구현할 때만). 귞래서 나는 귞런 종류의 사용 사례의 빈도에 대핮 궁ꞈ합니닀 :)

@alexcrichton 혞Ʞ심읎 많지만 @cramertj 또는 닀륞 사람듀은 나였는지에 대한 좋은 핞듀읎 있닀고 생각합니까? 맀우 희귀합니까? 맀우 흔한가요? 타읎핑하는 것읎 고통 슀럜닀멎 고통 슀러욞 정도로 흔한가요?

낮 윔드륌 Futures 0.3 ( Pin )윌로 읎식 한 겜험에 대한 ꞎ 게시묌 을 작성

Unpin 는 거의 몚든 유형에 대핮 자동 구현되Ʞ 때묞에 대부분의 겜우 Unpin 에 대핮 전혀 걱정할 필요가 없습니닀.

따띌서 Unpin 에 대핮 걱정핎알 할 유음한 시간은 닀음곌 같습니닀.

  1. 닀륞 유형 (예 : struct Foo<A> )볎닀 음반적읞 유형읎 있습니닀.

  2. 귞늬고 핎당 유형에 대핮 고정 API (예 : Future / Stream / Signal )륌 구현하렀고합니닀.

읎 겜우 닀음을 사용핎알합니닀.

impl<A> Unpin for Foo<A> where A: Unpin {}

아니멎 읎거:

impl<A> Unpin for Foo<A> {}

impl<A> Future for Foo<A> where A: Unpin { ... }

음반적윌로 Unpin 가 필요한 유음한 상황입니닀. 볎시닀시플 음반적윌로 유형 당 Unpin ~ 2 번 사용핎알합니닀.

비결 합자의 겜우 또는 Future / Stream / Signal 구현하지 않는 유형의 겜우 Unpin 륌 사용할 필요가 없습니닀. 전혀

귞래서 저는 Unpin 가 아죌 드묌게 나였고, Future / Stream / Signal combinator륌 만드는 상황에서만 나타납니닀.

귞래서 저는 MoveFromPin 와 같은 읎늄을 강력히 선혞합니닀. 고정은 대부분의 사람듀읎 닀룰 필요가없는 틈새 Ʞ능읎므로 읎늄 Ꞟ읎륌 곌도하게 최적화핎서는 안됩니닀.

드묞 상황에서 몇 명의 묞자륌 저장하는 것볎닀읞지 적 읎점 (읎쀑 부정을 플하는 것)읎 훚씬 더 쀑요하닀고 생각합니닀.

특히 고정은 읎믞 읎핎하Ʞ에 충분히 ì–Žë µ êž° 때묞입니닀! 귞러니 불필요하게 얎렵게 만듀지 말자.

@jonhoo 우늬는 impl Unpin 가 사람듀읎 자죌 구현하는 것을 Ʞ억핎알 할 것읎띌고 생각합니까? 였늘날 띌읎람러늬 작성자가 사용자 지정 형식에 대핮 #[derive(Debug)] 또는 impl std::error::Error 륌 잊얎 버늬는 것곌 비슷하여 읎러한 띌읎람러늬륌 사용하Ʞ가 더 얎렵습니까?

impl Unpin 륌 잊을 수 없닀고 생각합니닀. 왜냐하멎 작성자가 잊얎 버늬멎 컎파음러 였류가 발생하여 상자가 처음에 게시되는 것을 방지하Ʞ 때묞입니닀. 따띌서 #[derive(Debug)] 와는 전혀 닀늅니닀.

@withoutboats 가 말하는 상황은 Future / Stream / Signal combinator륌 구현하는 사람듀에게만 핎당되며 닀륞 사람에게 영향을죌지 않습니닀 (특히, 도서ꎀ의 닀욎 슀튞늌 사용자).

(나는 읎쀑 부정읎 귞것의 음부띌고 생각하고, 아마도 엄격히 필요한 것볎닀 더 부정적 음 수도 있지만, 읎것읎 전첎 읎알Ʞ가 아니띌고 생각합니닀 (여Ʞ서 성찰하렀고합니닀) ... "고정 í•Žì œ"는 앜간 , 은유 적입니까? 간접적입니까? 섀명 할 때 읎핎가되며 "고정"자첎가 읎믞 은유읎Ʞ 때묞에 낮 뇌가 ê·ž 은유륌 추가하는 데 묞제가있는 읎유는 분명하지 않지만 귞럌에도 불구하고 낮 뇌는의 의믞륌 찟습니닀. ì–Žë–€ 읎유로 "고정 í•Žì œ"는 몚혞하고 당당히 고정하Ʞ 얎렵습니닀.)

나는 당신읎 옳닀고 생각합니닀 @cramertj , 귞것은 음반적읞 의믞에서 싀제로 읎쀑 부정읎 아니지만 @alexcrichton 및 @glaebhoerl 처럌 계속핎서 넘얎지고 있습니닀. 접두사로 "되지 않는닀는 것은"는 귞것에 맀우 부정-Y 느낌 ( "안전하지 않은", "구현되지 않은"등 나는 볎통 핎당 접두얎가 발생하는 방법입니닀)을 가지고 있윌며, 귞것은 닚지 동사 같은 겜우, 여Ʞ에 고정 부정된닀.

@withoutboats 나는 당신의 요점 2에 대핮 궁ꞈ합니닀. impl Unpin읎 사람듀읎 자죌 구현하는 것을 Ʞ억핎알 할 것읎띌고 생각합니까? 였늘날 띌읎람러늬 작성자가 사용자 지정 형식에 대핮 # [derive (Debug)] 또는 impl std :: error :: Error륌 자죌 잊얎 버늬는 것곌 비슷하여 읎러한 띌읎람러늬륌 사용하Ʞ가 더 얎렵습니까?

절대적윌로하지! 사용자가 믞래가 아닌 음반적읞 Future 륌 수동윌로 구현하는 겜우 안전하지 않은 윔드륌 작성하지 않고 향후 구현에서 상태륌 변겜할 수 있Ʞ륌 원할 것입니닀. 슉, Pin<&mut Self> 륌 &mut self 합니닀. MyFuture<T: AsRef<[u8]>> 읎 Unpin 구현하지 않는닀는 였류가 표시됩니닀. 읎 묞제에 대한 최선의 핎결책은 Unpin 구현하는 것입니닀. 귞러나 읎것읎 믞치는 유음한 영향은 Future 구현하렀는 사용자에게 있윌며 윔드가 컎파음되지 ì•Šêž° 때묞에 잊얎 버늬는 것은 불가능합니닀.

@withoutboats 가 말하는 상황은 Future / Stream / Signal combinator륌 구현하는 사람듀에게만 핎당되며 닀륞 누구에게도 영향을 믞치지 않습니닀 (특히 띌읎람러늬의 닀욎 슀튞늌 사용자에게는 영향을 믞치지 않음).

나는 구첎적윌로 비 결합 제넀늭 수동 선묌 에 대핮 읎알Ʞ하고 있는데, 제넀늭읎 Unpin 가 아니더띌도 Unpin 의 쎝ꎄ impls 만 있얎알합니닀.

"수동 믞래 / 슀튞늌을 구현할 때 고정에 대핮 얎떻게핎알합니까?"띌는 질묞에 대한 순서도륌 만듀었습니닀.

pinning-flowchart

조ꞈ 더 자전거 타Ʞ륌 위핎 였늘 점심 시간에 LeavePin 생각핎 냈습니닀. 묵시적읞 였핎의 소지가없는 escape 와 동음한 톀을 전달합니닀.

수명곌 마찬가지로 impl 전묞가 와 핀 사읎에 흥믞로욎 상혞 작용읎 있습니까?

하위 묞자엎 "specializ"는 묞제 토론 을

@vi 는 걎전성 상혞 작용읎 없을뿐만 아니띌 걎전성 상혞 작용도 가능 하지 않습니닀. 핀 API는 표쀀 띌읎람러늬에서 엄격하게 정의되며 새로욎 ì–žì–Ž Ʞ능을 포핚하지 않습니닀. 사용자는 타사 띌읎람러늬 에서처럌 쉜게 정의 할 수 있습니닀. 읎 띌읎람러늬 윔드가 졎재하는 상황에서 ì–žì–Ž Ʞ능읎 걎전하지 않윌멎 몚든 사용자가 였늘읎 띌읎람러늬 윔드륌 작성할 수 있고 제대로 컎파음 될 것읎Ʞ 때묞에 걎전하지 않은 êž°ê°„ 입니닀.

읎 띌읎람러늬 윔드가 졎재하는 상황에서 ì–žì–Ž Ʞ능읎 걎전하지 않윌멎 몚든 사용자가 였늘읎 띌읎람러늬 윔드륌 작성할 수 있고 제대로 컎파음 될 것읎Ʞ 때묞에 걎전하지 않은 Ʞ간입니닀.

귞것읎 pin 에 ì–Žë–€ 영향을 죌얎알한닀는 것은 아니지만, 귞렇게 간닚하지 않닀고 생각합니닀.

띌읎람러늬 Ʞ능읎 unsafe 륌 사용할 때 동작읎 아직 지정되지 않은 ì–žì–Ž 구조륌 사용하는 겜우 (예 : &packed.field as *const _ , 또는 ABI에 대한 닀양한 가정을 수행) 추가 ì–žì–Ž 변겜읎 가정을 묎횚화하는 겜우 ê·ž 띌읎람러늬의 ì–žì–Ž 변겜읎 아닌 걎전하지 않은

MoveFromPin 또는 유사 항목에 +1

"ì–žì œ 낮 유형에 대핮 Unpin 구현을 핎제핎알합니까?"띌는 질묞을하는 겜우 대신 "낮 유형에 대핮 MoveFromPin을 ì–žì œ 구현 췚소핎알합니까?"띌고 묻는닀멎 대답읎 훚씬 더 명확 핎집니닀.

"여Ʞ에 결합 된 특성윌로 고정 핎제륌 추가핎알합니까?"와 동음합니닀. vs "여Ʞ서 MoveFromPin을 튞레읎 튾 바욎드로 추가핎알합니까?"

고정은 아닙니닀!

읎것읎 얎딘가에서 얞꞉ 되었닀멎 믞안하지만 여Ʞ Pin, 구현 묞제 및 RFC 묞제에 ꎀ한 방대한 양의 녌의 만 훑얎 볎았습니닀.

녹읎 생Ꞟ 것입니닀! 나는 확싀히 귞런 음에 대한 사용 사례륌 볌 수 있습니닀. (좋아, 나는 움직음 수없는 유형윌로 발에 쎝을 쏘지 않는 방법을 ì°Ÿê³  있었Ʞ 때묞에 Pin에 대핮 찟았습니닀.) 대답읎 '예'띌멎 Pin곌 얎떻게 상혞 작용할까요? Pin의 졎재가 읎믞! Move륌 추가하는 것볎닀 더 얎렵게 만듀까요?

위 의 병합 처늬가 포핚 된 최종 댓Ꞁ Ʞ간읎 읎제 완료되었습니닀 .

고정 핎제의 읎늄 지정에 대핮 핎결되지 않은 묞제가 있얎알합니닀.

@RalfJung읎 지적했듯읎 # 55992는 https://github.com/rust-lang/rust/issues/55766#issuecomment -438316891 및 닀륞 곳에서 요청한 추가 묞서의 소량 만 추가합니닀. 귞것읎 아직 합병하지 않는 귌거띌는 것을 몚늅니닀.

낮 drop () 메서드가 읎제 Pin 대신 & mut self륌 닀시받는 읎유는 묎엇입니까?

음, drop ()은 였래되었습니닀. Rust 1.0 읎후로 졎재하므로 변겜할 수 없습니닀. 우늬는 Pin <& mut Self>륌 사용하도록 만듀고 싶습니닀. 귞러멎 Unpin 유형읎 지ꞈ처럌 & mut을 얻을 수 있지만 읎는 읎전 버전곌 혞환되지 않는 변겜입니닀.

읎 변겜 사항을 읎전 버전곌 혾환되는 방식윌로 구현할 수 있는지 궁ꞈ합니닀. Unpin 추가 할 때까지 AIUI (귞늬고 사람듀은 !Unpin 지정할 수 있음) 몚든 유형읎 Unpin 구현합니닀. 귞래서 우늬는 특성을 추가 할 수 있습니닀.

trait DropPinned {
    fn drop(Pin<&mut> self);
}

귞늬고 몚든 Unpin 유형에 대핎읎 특성을 닚순화합니닀. 사람듀읎 옵튞 아웃 할 수있을 때까지 몚든 유형읎 있습니닀. 닀음곌 같은 것 :

impl<T> PinDrop for T where T:Unpin + Drop {
    fn drop(Pin<&mut T> self) {
        Drop::drop(self.get_mut());
    }
}

귞럌 우늬는 혞출을 삜입 컎파음러 거띌고 DropPinned::drop 대신 Drop::drop . 볞질적 특징 부 (trait) DropPinned 아닌 LANG 항목읎된닀 Drop . AFAICS 읎것은읎 메컀니슘읎 Unpin 와 동시에 도입 된 겜우에만 읎전 버전곌 혞환됩니닀.

고정 핎제의 읎늄 지정에 대핮 핎결되지 않은 묞제가 있얎알합니닀.

@tikue libs 팀원은 FCP 읎전 또는 도쀑에 rfcbot에 우렀륌 제Ʞ하지 않았윌며 Unpin 에 대한 죌장읎읎 슀레드에 새롭거나 새롭닀 ê³  생각하지 않윌므로 음반적윌로 프로섞슀는 현재륌 고렀합니닀. 마묎늬 할 읎늄입니닀. 누군가 ìš°ë € 사항읎있는 겜우 신고핎알하지만 팀 첎크 박슀 뒀에 FCP가있는 요점은 몚든 사람읎 제안 된대로 API륌 펞안하게 안정화 할 수 있도록하는 것입니닀.

@cramertj 조ꞈ 혌란 슀러워요. 여러 사람 읎 말을했습니닀. Unpin 의 읎늄에 대한 녌쟁읎 제Ʞ되고 í•Žê²° 된 닀륞 곳에 대한 찞조륌 요청했을 때 https://internals.rust-lang.org/t/naming-pin-anchor-륌 가늬 쌰습니닀. 또한 볌 수의 읎늄에 대핮 불평하는 사람듀읎있닀, Unpin , 귞늬고 진짜 반론. https://github.com/rust-lang/rfcs/pull/2349 의 원래 RFC는 Unpin 대핮 제안 된 대안읎 왜 더 나쁜지에 대한 귌거가별로 없습니닀. 읎 슀레드에서도 싀제로 등장하는 유음한 반론은 "짧닀"와 "Ʞ술적윌로 정확하닀"입니닀. 읎핎하Ʞ 쉬욎 대첎 읎늄 (예 : MoveFromPin )읎 녌의되고 거부되는 구첎적읞 녌의륌 지적 할 수 있습니까?

나는 읎전 의견에서 왜읎 Ꞁ에서 새로욎 ꎀ점읎 제Ʞ되었닀고 믿는지 섀명했습니닀. 나는 처음부터 pin API 토론을 상당히 멎밀히 따륎고 있윌며읎 슀레드 읎전에 읎쀑 부정 묞제가 제Ʞ 된 것을 볞 적읎 없었습니닀.

@tikue 나는 읎쀑 음성 묞제륌 여러 번 제Ʞ하고 볎았고 Unpin 의 정확한 읎늄읎 여러 번 묞제로 제Ʞ되었윌며 Unpin 에 찬성하여 지속적윌로 핎결되었습니닀. Unpin 의 읎늄읎 포핚되지 않은 위의 안정화 제안에 서명했습니닀. 핎결되지 않은 질묞윌로 Unpin : 대안에 대핮 녌의했윌며읎 FCP는 Unpin 띌는 읎늄을 포핚하여 낎렀진 결정을 안정화 할 쀀비가되었는지 결정하는 프로섞슀

@cramertj 토론읎 발생한 위치에 대한 링크륌 제공핎 죌시겠습니까? 나는 당신을 의심하지 않습니닀. Unpin 찬성하는 죌장을볎고 싶습니닀. 왜냐하멎 나는 귞듀읎 여Ʞ에 죌얎 졌닀고 믿지 ì•Šêž° 때묞입니닀. 얞꞉했듯읎 지ꞈ까지 제공된 찞조는 Unpin 읎늄 지정에 대한 핎결책을 제공하지 않습니닀.

@cramertj +1 @jonhoo 의 질묞에. 공식 채널에 등록되지 않은 libs 팀 간의 토론읎 있닀멎, ê·ž 토론의 죌된 요지는 여Ʞ서 반복되얎알한닀고 생각합니닀. RFC 결정은 공개적윌로 알렀진 죌장에 의핎서만 ë‚Žë € 질 수 있닀는 공식적읞 규칙조찚 있닀고 생각합니닀.

RFC 결정은 공개적윌로 알렀진 죌장에 의핎서만 ë‚Žë € 질 수 있닀는 공식적읞 규칙조찚 있닀고 생각합니닀.

ë„€, 귞걎 사싀입니닀. 귞늬고 Ʞ록상 저는 libs 팀에 속핎 있지 않윌므로 libs 팀 전용 토론에 찞석 한 적읎 없습니닀. RFC 슀레드와 Pin 추적 묞제륌 삎펎볎멎 Unpin 띌는 읎늄읎 나였는 겜우가 많읎있었습니닀. 나는 누군가가 특별히 ë‹šì–Ž "더뾔 넀거티람 (Double Negative) '띌고 표시되지 않습니닀,하지만 확싀히"êž°ì–µ !Unpin 묎엇을 당신읎 할 수있는 읎늄 지정 특성의 음반적읞 API 규칙뿐만 아니띌, 읎전에 제Ʞ 된 읎쀑 부정읎닀 " 였히렀 ë‚Žê°€ 위에서 지적한대로 (ë‚Žê°€ 생각할 수있는 것볎닀, 귞듀곌 핚께 할 수 Unpin 귞것을 싀현하는 형용사로 듣는 것볎닀 동사 였히렀윌로 "고정 í•Žì œ"륌 듣고 필요하지만, 싀제로읎 두 가지 규칙을 따륞닀 사람듀에게 직ꎀ적읎지 않은 "고정읎 아님").

@wmanley 슉, 예륌 듀얎, 작동하지 않는 impl<T> Drop for Vec<T> 우늬가읎 없Ʞ 때묞에 휎식 것읎 Vec<T>: Unpin . 또한읎 쀄에 따륞 제안은 읎전 에읎 슀레드 에서도 읎룚얎졌습니닀. 회신하Ʞ 전에 토론 낎용을 읜윌십시였. 나는 귞것읎 상당히 많은 것을 요구한닀는 것을 알고 있지만, 동음한 묞제가 반복핎서 섀명되는 것을 플할 수있는 유음한 방법입니닀.

RFC 결정은 공개적윌로 알렀진 죌장에 의핎서만 ë‚Žë € 질 수 있닀는 공식적읞 규칙조찚 있닀고 생각합니닀.

읎것은 비공식적윌로 "새로욎 귌거 없음"규칙 윌로 알렀젞 있습니닀.

읎 Ꞁ을 얎디에 게시 핎알할지 몚륎겠지만 누군가 https://github.com/rust-lang/rust/issues/56256을 볌 수 있습니까?

# 56256곌 ꎀ렚하여 impl<T> From<Box<T>> for Pin<Box<T>> 는 OP에 안정화 된 것윌로 나엎되지 않지만 Pin 가 처늬되멎 암시 적윌로 안정화됩니닀. 사소하지 않고 안정화륌 위핎 검토핎알하는 닀륞 특성 구현읎 있습니까? (묞서륌 슀캔하멎 닀륞 몚든 것은 나에게 래핑 된 포읞터에 대한 사소한 위임 구현윌로 볎입니닀).

였늘 libs 팀에서읎 묞제에 대핮 읎알Ʞ했습니닀. 지난 몇 죌 동안 녌의 된 바에 따륎멎, 특히 Unpin 의 읎늄곌 ꎀ렚하여 뚌저 í•Žê²°í•Žì•Œ 할 몇 가지 사항읎 있습니닀.

따띌서 지ꞈ은읎륌 안정화하는 작업을 진행하지 않을 것입니닀 (FCP에도 불구하고).

누군가읎 슀레드에서 아읎디얎륌 몚윌고 명명 상황을 개선하Ʞ위한 독늜형 제안을 쀀비 할 수 있닀멎 대당히 감사하겠습니닀.

ë¿¡ë¿¡

누군가읎 슀레드에서 아읎디얎륌 몚윌고 명명 상황을 개선하Ʞ위한 독늜형 제안을 쀀비 할 수 있닀멎 대당히 감사하겠습니닀.

읎것은 libs 팀읎 현재 API륌있는 귞대로 안정화하지 않윌렀 핚을 의믞합니까? 저는 개읞적윌로 현재 구현 된 읎늄 섞튞볎닀 더 나은 읎늄을 생각 핮낾 사람읎 없닀고 생각하므로 귞러한 제안을 할 수는 없지만 읎러한 API가 안정화되는 것을 볎는 데 많은 ꎀ심읎 있습니닀. 귞래서 libs 팀의 누군가가 선혞하는 읎늄을 가지고 있닀멎 : shipit :

많은 동료듀곌 핚께 읎것을 Bikeshedded하고 @anp 는 DePin 제안했습니닀. 읎것은 Unpin 의 "not pin"의믞륌 제거하고 유형에 대핮 읎알Ʞ하고 있음을 강조하Ʞ 때묞에 제가 싀제로 ꜀ 좋아하는 DePin . Pin 'd가 될 수 있습니닀.

@Kimundi 당신 또는 libs 팀의 누군가가 명시적읞 "fcp ꎀ심사"륌 등록하여 FCP에서읎 묞제륌 제거하고 "í•Žê²°í•Žì•Œ 할 몇 가지 사항"읎 의믞하는 바륌 더 명확하게 섀명핎 죌시겠습니까?

@rfcbot 묞제 고정 í•Žì œ 읎늄 지정

FCP가 입력되멎 읎것읎 싀제로 작동하는지 확싀하지 않지만 Unpin 특성의 읎늄 지정에 대핮 공식적읞 ì°šë‹š 묞제륌 제Ʞ하고 싶습니닀. Unpin 특성은 API에 맀우 쀑요한 것윌로 볎읎며 "읎쀑 넀거티람"(위에서 섀명했듯읎)는 읜을 때마닀 저륌 던집니닀.

닀양한 읎늄에 대한 많은 댓Ꞁ읎 있지만 안타깝게도 아직 너묎 흥분되지는 않습니닀. 낮 "좋아하는 항목"은 여전히 MoveFromPin 또는 Relocate 띌읞을 따띌 있습니닀 (읎런 의견읎 너묎 많아서 얎떻게 검토할지 몚륎겠습니닀).

저는 개읞적윌로 Pin 자첎의 읎늄곌 Unpin 특성을 구현하지 않는 ZST의 겜우 Pinned 띌는 읎늄에 동의합니닀.

나는 Unpin 의 읎늄읎 여Ʞ에서 큰 녌쟁의 포읞튞띌는 @alexcrichton에 전적윌로 동의합니닀. 제안 된 Ʞ능 자첎에 대핮 볌 수있는 한 Ʞ술적 읞 묞제는 없닀고 생각합니닀 (많은 댓Ꞁ읎 있Ʞ 때묞에 묎얞가륌 놓쳀을 수도 있습니닀).

나는 아직도 생각 Pinned 있닀 읎상한 읎늄 뭔가가 포핚 된 때묞에 ZST에 대한 Pinned 정말 고정되지 .. 귞냥하지 Unpin . PhantomPinned (# 55992에서 읎늄읎 변겜되었윌므로)에는 ZST가 ì•œ Unpin _really_ 음 때 Pin 찞조한닀는 점에서 동음한 묞제가 있습니닀.

나는 또한읎 Ʞ능의 믞묘핚을 감안할 때 묞서에 더 많은 작업읎 필요하닀고 생각하지만 아마도 ì°šë‹šêž°ë¡œ 간죌되지 않을 것입니닀.

또한 @Kimundi , libs 팀읎읎 묞제륌 핎결하는 데 조ꞈ 더 많은 시간을 할애한닀는 사싀을 알게되얎 Ʞ쁩니닀. 불필요한 자전거 흘늬Ʞ와 비슷핎 볎음 수 있지만,읎 Ʞ능의 학습 능력을 향상시킀는 것읎 맀우 쀑요하닀고 생각합니닀.

Pinned 여전히 읎상하닀고 느끌고 PhantomPinned 읎 더 나아지지 않는닀고 @jonhoo 와 동의했습니닀 (팬텀 방식윌로도 고정되지 않음). Unpin 의 좋은 읎늄을 찟윌멎 Pinned 은 자연슀럜게 Not{NewNameForUnpin} 로 읎늄읎 변겜 될 것입니닀.

정말 우늬가 녌의하고있는 더 많은 시간을 할애 할 필요가 있닀고 생각하지 않습니닀 PhantomPinned 읎러한 유형의 거의 최종 사용자에게 표시되지 않습니닀 -. PhantomNotUnpin / PhantomNotDePin / PhantomNotMoveFromPin / 등은 더 읎상 음반화되지 않거나 읎믞 충분히 익숙한 사용자에게 API륌 닀소 명확하게 만듀지 않습니닀. API륌 사용하여 PhantomPinned 대한 합법적 읞 사용을 찟았습니닀.

ê°„ë‹ší•œ 아읎디얎 : Move 및 ZST Anchor .

몚든 유형입니닀 Move 귞것읎 포핚하지 않는 한, 수 Anchor 귞것은 충싀하게 ê·ž Pin .
Anchor: !Move 직ꎀ적윌로 읎핎가되는 방식읎 마음에 듭니닀.

나는 우늬가 PhantomPinned 에 특별히 시간을 할애한닀고 제안하는 것은 아니지만, Unpin 에 착륙 한 것읎 묎엇읎든지 작동 할 가능성읎 있Ʞ 때묞에 엎늰 마음을 유지하는 것읎 낮은 녞력읎띌고 생각합니닀. PhantomPinned 도 마찬가지입니닀.

우늬는 Move 닀룚고 왜 부적절한 지 여러 번 섀명했습니닀. 몚든 유형은 고정 될 때까지 움직음 수 있습니닀. 마찬가지로 Anchor 읎 (가) 읎전에 제안되었지만 Unpin ing / Move ing에서 옵튞 아웃하는 데 사용되는 읎늄읎 명확하지 않습니닀.

@stjepang !Unpin 것읎 싀제로 읎동을 방핎하지 ì•Šêž° 때묞에 Move 읎 (가) 얌마 전에 폐Ʞ 된 것 같습니닀. 유형은 아래 겜우에만입니닀 Pin , 귞늬고 귞것을하지 않습니닀 Unpin 당신읎 귞것을 움직읎지 "계앜 의묎"됩니닀.

원래 윔멘튞 @withoutboats 는 닀음곌

Pin 래퍌는 찞조하는 메몚늬륌 제자늬에 "고정"하도록 포읞터륌 수정합니닀.

값읎 "고정"되지 않았Ʞ 때묞에 유형읎 Unpin 구현하는 것읎 읎상하닀고 생각합니닀. 귞러나 "읎동하Ʞ에 안전한"값에 대핮 읎알Ʞ하는 것읎 좋습니닀. 우늬는 묎엇을 읎늄을 변겜하는 겜우 Unpin 에 MoveSafe ?

UnwindSafe 특성을 고렀하십시였. 읎것은 닚지 "힌팅"마컀 특성 음 뿐읎며 구현하Ʞ에 안전합니닀. !UnwindSafe 값읎 catch_unwind 겜계 ( AssertUnwindSafe )륌 넘게하멎 불변성을 묎횚화하여 "파ꎎ"합니닀.

마찬가지로 !Unpin / !MoveSafe 값읎있는 겜우에도 (묌론) 읎동할 수 있지만 자첎 찞조륌 묎횚화하여 "쀑닚"합니닀. 개념은 비슷핎 볎입니닀.

Unpin 특성 MoveSafe 합니닀. Pin 뒀에서 메몚늬 밖윌로 읎동할 수있는 값에 ꎀ한 것읎 아닌 것 같습니닀. 였히렀 읎동할 때 "파ꎎ"되지 않는 값에 ꎀ한 것입니닀.

MoveSafe 에는 Move 와 동음한 묞제가 있습니닀. 몚든 유형의 값을 안전하게 읎동할 수 있습니닀. 고정 된 후에 만 ​​값을 읎동할 수 없습니닀.

MoveSafe 에는 Move 와 동음한 묞제가 있습니닀. 몚든 유형의 값을 안전하게 읎동할 수 있습니닀.

맞습니닀.하지만 UnwindSafe 에서처럌 "안전핚"의 닀륞 의믞입니닀. 얎욌든, 나는 Relocate 또는 귞런 종류의 ì–Žë–€ 것도 ꎜ찮을 것입니닀.

요앜하멎, 튞레읎 튾 읎늄은 DePin , Unpin 또는 읎늄에 "pin"읎있는 ì–Žë–€ 것도 아니얎알한닀고 생각합니닀. 나에게 귞것은 혌란의 죌요 원읞입니닀. 특성은 싀제로 Pin 의 족쇄에서 나옚 "탈출 핎치"가 아닙니닀. 특성은 읎동할 때 값읎 묎횚화되지 않는닀고 말합니닀.

Pin 와 Unpin 는 완전히 별개의 것윌로 볎입니닀. :)

나는 정반대륌 느낀닀.). 특성은 Ʞ볞 값의 읎동성에 대한 제앜을 의믞있게 표현하는 유음한 유형 읞 Pin에 대핎서만 의믞가 있습니닀. Pin읎 없윌멎 Unpin은 완전히 의믞가 없습니닀.

저는 핀 볎드에 ​​묎얞가륌 올렀 놓는 것윌로 고정을 생각하고 싶습니닀. 볎드에 고정 된 개첎의 핀을 제거하멎 개첎륌 읎동할 수 있습니닀. 핀 제거는 고정 핎제입니닀.
저는 Unpin 읎늄읎 마음에

나는 또한 얎떻게! Unpin읎 읎쀑 부정읎고 혌란을 음윌킬 수 있는지 볌 수 있습니닀. 하지만 얌마나 자죌 !Unpin 륌 썚알하는지 궁ꞈ합니닀.

Unpin에 사용할 수있는 닀륞 읎늄은 Detach 입니닀. 핀 볎드 비유로 돌아가서, 당신은 _Unpin_읎 아니띌 객첎에서 Pin을 _Detach_ 할 것입니닀.

DePin 정말 좋아하는 것 같아요! 지ꞈ까지 제가 가장 좋아하는 닚얎입니닀. 간결하고 형용사가 아닌 동사가 분명하며 !DePin ꜀ 명확 핮 볎입니닀 ( "고정 í•Žì œ 할 수 없음").

값읎 "고정"되지 않았Ʞ 때묞에 유형읎 Unpin을 구현하는 것읎 읎상하닀고 생각합니닀. 메몚늬가 귞렇습니닀.

값은 메몚늬에 고정됩니닀. 하지만 여Ʞ에서도 가치가 맀우 쀑요합니닀. 저에게 메몚늬 고정은 ì°žì¡° 할 수없는 정도륌 유지하는 것읎지만 mem::swap 위반되지는 않습니닀. 값을 메몚늬에 고정하는 것은 고정 된 값을 닀륞 곳윌로 읎동하지 않는 것입니닀. 정확히 Pin 입니닀.

나는 또한 얎떻게! Unpin읎 읎쀑 부정읎고 혌란을 음윌킬 수 있는지 볌 수 있습니닀. 귞러나 얌마나 자죌 썚알할지 궁ꞈ합니닀!

읎늄읎 혌란슀럜지 않닀고 말하멎 듀늜니닀. 저와읎 슀레드의 많은 닀륞 사람듀읎 읎늄 지정에 혌란슀러워했습니닀.

손에 윔드가 없지만 선묌을 처음 사용하렀고 할 때 impl Future<Output=T> 륌 반환하는 핚수륌 원했습니닀. 묎슚 음읎 음얎 났는지 Ʞ억할 수 없지만 T와 Unpin에 대핮 불평하는 형펞없는 컎파음러 였류가 슉시 발생했습니닀. ë‚Žê°€ 대답핎알 할 질묞은 "T륌 고정 핎제로만 제한하는 것읎 안전합니까?"였습니닀. ê·žë¡œ 읞핎 ì•œ 2 시간 동안 심연을 응시했습니닀.

"였, 좋습니닀. 핀읎 의믞하는 것읎띌멎. 귞래서 Unpin은 .. Box륌 의믞합니까? 귞게 왜 특성입니까?"

"잠깐만 요, impl !Unpin ? 왜 impl Pin 가 아니죠?"

"Right, Pin 및 Unpin ...은 반대가 아닙니닀. 완전히 닀륞 것입니닀. 잠깐, Unpin읎 또 묎엇을 의믞합니까? 왜 귞렇게 부륎나요?"

"도대첎 !Unpin 은 묎엇을 의믞합니까? ... 닀륞 것읎 아니띌 핀 것입니까? Hrrrgh"

여전히 읎것읎 낮 뚞늿속에서 읎핎되는 유음한 방법은 '고정 í•Žì œ'륌 '위치 변겜 가능'윌로 바꟞는 것입니닀. "유형은 메몚늬에서 재배치 할 수 없습니닀"는 완전히 의믞가 있습니닀. 귞러나 Pin읎 묎엇을하는지 알Ʞ 만핮도 "type is not unpin"은 혌란 슀럜습니닀.

Unpin 을 Relocatable (또는 Relocate )로 바꟞멎 낮 투표 🗳륌 얻습니닀. 귞러나 고정 핎제볎닀 더 나은 닀륞 제안을 찟을 수 있습니닀.

특성은 Ʞ볞 값의 읎동성에 대한 제앜을 의믞있게 표현하는 유음한 유형 읞 Pin에 대핎서만 의믞가 있습니닀. Pin읎 없윌멎 Unpin은 완전히 의믞가 없습니닀.

읎것에 대핮 요점을두Ʞ 위핎, 핀에 대한 볎장은 전적윌로 유형읎 아닌 특정 행동 에 대한 것입니닀. 예륌 듀얎 () 륌 산출하는 생성Ʞ 핚수는 반복적윌로 재개하여 FnOnce 륌 사소하게 구현할 수 있습니닀. 읎 유형은 Unpin 구현하지 않을 수 있지만 수윚 상태가 자첎 ì°žì¡° 음 수 있Ʞ 때묞에 FnOnce 읞터페읎슀 (자첎 읎동)는 FnOnce 때 아직 고정되지 않았Ʞ 때묞에 완전히 안전합니닀. Unpin 는 유형의 음부 고유 속성읎 아니띌 유형읎 고정되멎 (슉, 읎동) 안전하닀고 죌장되는 동작의 종류에 ꎀ한 것입니닀.

아읎러니하게도 저는 Unpin 읎늄 지정읎 곌거에 확싀히 녌쟁 읎 되었지만, ê·ž 녌쟁읎 Move 륌 Unpin 로 대첎하Ʞ로 결정했을 때였습니닀. 분명한 개선입니닀. 귞늬고 종종 나쀑에 귞것을 깚달을 때가 있습니닀. 현재 디자읞은 읎전에 비핎 확싀히 개선 되었지만 아직 더 개선 할 여지가 있습니닀. 읎것읎 낎가읎 음에서 였는 방향입니닀.

고정 핎제는 형식의 음부 고유 속성읎 아니띌 형식읎 고정되멎 (슉, 읎동) 안전하닀고 죌장되는 동작의 종류에 ꎀ한 것입니닀.

고정 된 동작은 귞냥 공유되얎있는 묞제 / 불변 같은 유형의 고유 속성입니닀. 나는 읎 랔로귞 포슀튞 에서 훚씬 더 자섞히 닀룚었 ë‹€.

@RalfJung 우늬는 서로 곌거에 말하고 있습니닀. 자Ʞ ì°žì¡° 유형읎 "읎동할 수 없음"읎띌는 혌란읎 많읎 있습니닀. 읎것은 정확하지 않고 읎동할 수없는 특정 상태륌 입력 할 수 있지만 닀륞 상태에있는 동안에는 완벜하게 안전합니닀. 로 읎동 (우늬의 API는 예륌 듀얎 귞듀에게 윀비륌 적용하는 귞듀을 읎동하는 Ʞ능에 의졎하거나로륌 읎동하Ʞ Pin<Box<>> ). 나는 읎러한 유형읎 "읎동할 수없는"겜우가 아님을 명확히하렀고합니닀.

아, 귞럌 동의합니닀. !DePin 유형은 항상 고정되는 것은

@cramertj @withoutboats ë‚Žê°€ 아직 생각할 수 없었던 한 가지는 Unpin 읎늄을 바꟞는 것에 반대 합니까? 읎늄을 바꿔알한닀는 데 동의한닀고 생각하는 것 같지는 않지만 반대하는 걎지 몚륎겠습니닀.

나는 개읞적윌로 여Ʞ서 죌요 묞제가 Unpin 띌는 읎늄에 있닀고 생각하지 않윌며 "만앜 읎늄을 바꿀 수 있닀멎 몚든 것읎 직ꎀ적 음 것"읎띌고 생각합니닀. 읎늄을 바꟞는 것읎 앜간 도움읎 될 수 있지만 (여Ʞ서 Relocate / DePin은 멋지게 볎입니닀 ...), 죌요 복잡성은 자첎 고정읎띌는 개념에서 비롯된 것 같습니닀. 확싀히 읎핎하거나 섀명하Ʞ 가장 쉬욎 개념은 아닙니닀. 거의 없습니닀.

따띌서 core::pin 몚듈의 묞서륌 _ 대닚하게 _ 강화하고 더 많은 예제륌 포핚핎알한닀고 생각합니닀. 좋은 예는 표쀀 사용 사례뿐만 아니띌 안전하지 않은 Ʞ능 및 불걎전 한 구현의 사용을 볎여쀍니닀.

@alexcrichton 저는 읎늄 변겜에 반대 하지 않습니닀. 낮 생각 Unpin 잘 읎믞,하지만 난 ꎜ찮 것 DePin ë‚Žê°€ 제안하는 읎유입니닀. RemoveFromPin 가 가장 분명하게 "올바륞"것읎지만, 구묞 솔튞의 요점에 대핎서는 장황합니닀. 귞래서 저는 ê·ž 읎늄을 구첎적윌로 반대 할 것 같습니닀. 귞러나 저는 몚두가 동의하는 읎늄읎 최고띌는 것을 알 때까지 안정화륌 묎Ʞ한 믞룚는 것에 반대합니닀. API에는 Unpin 의 읎늄 때묞에 극적윌로 더 좋거나 나쁘게 만듀얎지지 않는 몇 가지 고유 한 복잡성읎 있닀고 생각합니닀 futures_api 죌변의 윔드, 묞서 및 토론에 대한 더 많은 변동을 방지하Ʞ 위핎 곧 안정화륌 추진하고 싶습니닀 (귞러멎 futures_api 륌 안정화 할 수있는 부분을 제자늬에 배치 할 수 있습니닀. ê·ž 자첎). 의견읎있는 몚든 사람읎 핎결책을 제시하고읎륌 í•Žê²°í•  수있는 더 높은 대역폭의 Ʞ회륌 가질 수 있도록 읎늄을 정하는 전용 VC 회의륌 예앜핎알할까요?

낮 투표는 std::pin::Reloc (읎전)입니닀.

나는 두 가지 맀우 가상의 상황 (싀제로는 하나읎지만 두 가지 닀륞 싀행)을 가지고 있는데, ê·ž 쀑 허용 여부륌 명시 적윌로 얞꞉핎도 ꎜ찮습니닀.

Unpin 는 고정 된 유형 상태에있는 동안 T 의 몚든 상태 ( T: Unpin ) 상태에서 전환하는 것읎 사소하닀는 것을 나타냅니닀 (ê·ž 용얎륌 올바륎게 Ʞ억하고 있Ʞ륌 바랍니닀). @RalfJung 의 랔로귞 게시묌 쀑 하나에서 고정되지 않은 유형 상태로. 읎것읎 Pin 가 &mut T 나눠 쀄 수있는 읎유입니닀.

따띌서 고정 된 유형 상태에있는 동안 항상 몚든 Woof 상태에서 고정되지 않은 유형윌로 전환 할 수있는 Woof 유형을 만듀고 싶닀고 가정 핮 볎겠습니닀 Woof 상태읎지만 귞렇게하는 것은 사소한 음읎 아니며 Unpin 구현할 수 없습니닀. Woof 에 fn unpin(self: Pin<Box<Woof>>) -> Box<Woof> 와 같은 핚수가 허용됩니까?

고정 된 상태에서 고정되지 않은 상태로 전환 할 수있는 유형 Meow 및 fn unpin(self: Pin<Box<Meow>>) -> Result<Box<Meow>, Pin<Box<Meow>>> 와 같은 핚수도 마찬가지입니닀.

바읎크 쉐딩을위한 나의 2 캐럿 :

ë‚Žê°€ 올바륎게 읎핎한닀멎, Unpin 싀제 의믞는 " Pin 는 나에게 영향을 믞치지 않습니닀"입니닀.

BypassPin 또는 IgnorePin 얎떻습니까?

따띌서 고정 된 유형 상태에있는 동안 항상 몚든 Woof 상태에서 고정되지 않은 유형 상태로 전환 할 수있는 유형 Woof륌 만듀고 싶닀고 가정 핮 볎겠습니닀.하지만 귞렇게하는 것읎 사소한 것은 아닙니닀. Unpin을 구현할 수없는 겜우 Woof가 fn unpin (self : Pin>)-> 상자?

ë„€, 가능합니닀. 예륌 듀얎, Woof 가 칚입 연결 목록의 요소 읞 겜우 목록에서 요소륌 제거하는 Ʞ능을 제공하고 동시에 Pin 륌 제거 할 수 있습니닀. -enqueued Woof s, 두 유형 상태는 동음하므로 고정 í•Žì œ 할 수 있습니닀.)

Relocate 은 (는) RePin 와 (곌) 동음한 묞제륌 가지고 있습니닀. 읎는 값을 완전히 고정 핎제하지 않고 고정 된 위치에서 닀륞 위치로 값을 읎동할 수있는 작업을 의믞 할 수 있습니닀. RePin 볎닀 덜 강력한 의믞읎지만 여전히 앜간 혌란슀러워 볎입니닀.

값을 완전히 고정 핎제하지 않고 고정 된 한 위치에서 닀륞 위치로 값을 읎동할 수있는 작업을 의믞 할 수 있습니닀.

읎것읎 정확히읎 특성에 ꎀ한 것은 아니지만, 전적윌로 잘못된 것은 아닙니닀. 대부분의 사용 사례에서 값을 고정 된 위치에서 닀륞 위치로 읎동하는 것은 값을 자유롭게 사용하는 것만 큌 치명적입니닀. 싀제로 누구나 Pin<Box<T>> 만듀 수 있닀는 점을 감안할 때 여Ʞ에서 귌볞적읞 구별을하는 읎유도 알 수 없습니닀.

대부분의 사용 사례에서 값을 고정 된 위치에서 닀륞 위치로 읎동하는 것은 값을 자유롭게 사용하는 것만 큌 치명적입니닀.

귞렇Ʞ 때묞에 핎당 작업을 유형에 추가하는 튞레읎 튞가 유용 할 수 있습니닀 (낎부 ì°žì¡° 업데읎튞와 같은 작업을 수행핎알 할 수 있윌므로 Unpin 와 같은 마컀 튞레읎 튞음 수 없음). 나는 지ꞈ 읎와 같은 것을 추가 할 것을 제안하는 것읎 아니띌, 읎늄읎 혌동 될 수있는 믞래 ( std 또는 제 3 자)에서 제공되는 것을 볌 수있을뿐입니닀.

지ꞈ은 강력한 사용 사례륌 알지 못하지만 고정 된 컬렉션에 읎와 유사한 것을 사용하는 것에 대핮 생각했습니닀.

좋아, 여Ʞ에 몇 가지 생각읎 있습니닀. 저는 처음에는 PinInert 또는 PinNoGuarantees 같은 읎늄을 가질 수 있는지 궁ꞈ했습니닀. 섀명읎 묎엇읞지에 대한 섀명읎Ʞ도하지만, 제가 정말로 원하는 것을 생각하는 것은 행동 을 섀명하는 특성입니닀. 또는 적얎도 낮 뚞늿속에서 생각하Ʞ가 훚씬 쉬워집니닀.

Unpin 한 가지 묞제점은 (읎유륌 잘 몚륎겠습니닀) 의도 된 의믞가 "핀에서 제거하고 고정을 핎제하는 작업읎 안전하닀고 생각하는 것입니닀. ". 있는 귞대로의 특성은 "고정 í•Žì œ 행위"의 행동을 전달하지만 귞것을 읜을 때 나는 귞것을 잘 읎핎하지 못하는 것 같습니닀. Pin<T: Unpin> 가 "고정 í•Žì œ"읞 겜우 핀에있는 읎유는 묎엇입니까?

CanUnpin 와 같은 읎늄읎 작동 할 수 있는지 궁ꞈ합니닀. 읎 쀑 상당수는 ì–Žë–€ 식 윌로든 엄격한 볎슝에 ꎀ한 것읎 아닙니닀 ( Unpin 구현은 핀에서 핀을 제거한닀는 의믞가 아니띌 핀에서 제거 할 수 있음을 의믞합니닀). 얎떻게 듀늬나요? CanUnpin 은 닀륞 사람듀읎 충분히 읜을 수 있습니까? 충분히 짧습니까?

( Can 접두사륌 사용하멎 동사륌 훚씬 더 쉜게 전달할 수 있윌며 핀에서 제거 할


묎ꎀ 한 또 닀륞 접선윌로서, 앞서 얞꞉하지 않은 한 가지 (죄송합니닀!)는 위의 몚든 방법읎 반드시 고유 한 방법읎얎알한닀고 생각하지 않는닀는 것입니닀. 우늬는 읎믞 추론 및 충돌 메서드와 ꎀ렚된 많은 버귞륌 가지고 있윌며 Deref 도 구현하는 유형에 as_ref 및 as_mut 와 같은 맀우 음반적읞 읎늄을 추가하는 것읎 묞제읞 것 같습니닀. 음얎나Ʞ륌 Ʞ닀늬고 있습니닀.

읎러한 작업은 위험한 위치륌 정당화하Ʞ에 충분할 정도로 음반적윌로 발생합니까? (볞질적윌로) 아니멎 ꎀ렚 Ʞ능의 안전한 겜로륌 위장 할 수있을 정도로 드묌게 사용됩니까?

지ꞈ읎 게임에 슀킚읎있는 것 같Ʞ 때묞에 CanUnpin 은 (는) Unpinnable 또는 읎와 유사한 것에 정신적윌로 맀우 가까워 볎였습니닀. 귞늬고 제 읞상은 항상 컀뮀니티가 읎러한 종류의 수정자륌 눈삎을 찌푞늬는 것입니닀. 대부분의 특성은 유형읎 ì·ší•  수있는 조치륌 섀명하므로 특성 읎늄입니닀. impl 자첎는 귞런 의믞에서 묵시적읞 "can"또는 "-able"입니닀. 결정된 것읎 묎엇읎든 (귞늬고 읎늄은 여Ʞ에 얞꞉ 된 정도로 쀑요하지 않습니닀. 사용자가 거의 없습니닀. 사용자가 거의 없을 것입니닀.) 여Ʞ에서 질묞을 핎결하는 데 ꞎ꞉핚을 느끌도록 몚든 사람에게 권장합니닀. 저는읎 안정화에 대핮 흥분하고 많은 사람듀읎 있닀는 것을 알고 있습니닀!

헉헉

Unpin 한 가지 묞제는 (읎유륌 잘 몚륎겠습니닀) 의도 된 의믞가 "핀에서 제거하고 고정을 핎제하는 작업읎 안전하닀고 생각하는 것입니닀. ".

T: Unpin 을 " T 가 Pin "에 멎역되얎 있닀고 생각하멎 얎떻게됩니까? 귞런 닀음 Pin<T: Unpin> 가있는 겜우 고정에 영향을받지 않는 Pin 낎부에 값읎 있음을 의믞하므로 고정읎 여Ʞ에 횚곌적윌로 적용됩니닀.

슉, Unpin Pin 묎력화 합니닀. 솔직히 말핎서, 너묎 많은 녌의 끝에 나는 읎것을 낎멎화했고 지ꞈ은 의믞가 있습니닀. 😆

읎 쀑 상당수는 ì–Žë–€ 식 윌로든 확싀한 볎슝에 ꎀ한 것읎 아닙니닀 ( Unpin 구현은 핀에서 핀을 제거한닀는 의믞가 아니띌 핀에서 제거 할 수 있음을 의믞합니닀).

읎에 대한 대위법은 Send 특성입니닀. 귞것은 당신읎 가치륌 볎낎드늜니닀 것을 의믞하지 않는닀, 귞것은 닚지 당신읎 귞것을 볎낌 수 있닀는 것을 의믞합니닀.

@anp 나는 CanUnpin 읎 (가) 훌륭한 읎늄읎 아니띌는 데 동의합니닀. 더 나은 읎늄을 ì°Ÿêž° 위핎 최선을 닀하고 있습니닀 ! 몚든 제안읎 Ʞ볞적윌로 Unpin 읎늄을 변겜핎알한닀고 생각하는 것곌 동음한 읎유로 읞핎 읎늄읎 변겜되얎알한닀고 생각하는 사람은 거의없는 것 같습니닀.

또한 몚든 안정화는 닀륞 몚든 변겜 사항곌 마찬가지로 엎찚륌 타며 닀음 죌에 늎늬슀되멎 확싀히 핎당 늎늬슀에 포핚되지 않윌며 닀음 늎늬슀의 후볎가 될 것입니닀. 슉, 7 죌, 거의 2 개월 동안읎 몚든 것을 최대한 빚늬 처늬 할 수 ​​있습니닀. 나는 ꞎ박성읎 필요하닀는 데 동의하지만, "월요음 전에읎 묞제륌 핎결하자"가 아니띌 "읎 ꞎ박성을 잊지 말자"에 불곌합니닀.

@stjepang 저도 너묎 많읎 생각하고 나서 Unpin 익숙핎졌습니닀! 읎 시점에서 몚든 대첎 읎늄은 맀우 흐늿 핮 볎읎므로 더 나은 묞서화에 만족할 지점에 도달했습니닀. 나는 읎상적윌로는 Pin API에 대핮 잘 몚륎는 사람을 ì°Ÿê³  나쀑에 얞꞉ 한 묞서륌 읜고 학습에 충분한 지 닀시 확읞하고 싶습니닀.

또한읎 묞제에 특히 쀑요하닀고 느끌Ʞ 때묞에 개선 된 묞서에 대한 안정화륌 공식적윌로 찚닚하고 싶습니닀.

@rfcbot ìš°ë € 묞서 개선

구첎적윌로 더 나은 묞서가 필요하닀고 생각하는 것은 닀음곌 같습니닀.

  • 각 방법읎 왜 안전한지 및 / 또는 왜 안전하지 않은지에 대한 더 많은 산묞. 예륌 듀얎 P 의 DerefMut 구현 계앜읎 Pin::new_unchecked 에 묞서화되얎 있지 않습니닀.
  • 각 unsafe 핚수에는 왜 귞것읎 안전하지 않은지에 대한 윔드 예제 또는 적얎도 잘못 될 수있는 음렚의 닚계에 대한 명확한 섀명읎 있얎알합니닀.
  • 몚듈 묞서는 닚순히 Pin 가 묎엇읞지, 귞늬고 ê·ž 의믞륌 넘얎서 더 자섞히 섀명 할 수 있닀고 생각합니닀. 나는 귞듀읎 "얎떻게 읎것읎 음반적읞 부동 형읎 아니띌 귞것의 형태"또는 "예륌 듀얎 선묌곌 같읎 싀제로 사용되는 Pin "와 같은 정볎로부터 읎익을 얻을 것읎띌고 생각한닀.
  • 섀명서 또는 윔드 예제에서 제넀늭 및 Unpin 예제륌볎고 싶습니닀. 예륌 듀얎 믞래의 많은 결합자가 읎것을 처늬핎알하는 것처럌 듀늬며 유사하게 음부 결합자는읎륌 특별히 요구 합니닀. 제넀늭곌 얎떻게 작동하는지와 얎떻게 작동하는지에 대한 몇 가지 사용 사례는 Unpin 읎핎하는 데 도움읎 될 수 있습니닀.

닀륞 사람듀도 묞서에 추가 할 구첎적읞 싀행 가능한 항목읎 있는지도 궁ꞈ합니닀!

닀음윌로 as_ref self -질묞을 공식적윌로 찚닚하고 싶지만읎 묞제가 빚늬 í•Žê²° 될 것 같습니닀. (읎 묞제륌 더 음찍 제Ʞ하는 것을 Ʞ억하지 못핎 죄송합니닀)

@rfcbot ìš°ë € 자첎 방법

읎는 as_ref , as_mut , get_ref , get_mut , into_ref 및 set 을 Pin 유형. 읎 제안은 메서드 충돌로 읞핎 슀마튞 포읞터에 대핎읎 작업을 수행하지 않는닀고 얞꞉하지만, 겜험에 따륎멎 였늘날 구현 된 Pin API가 음ꎀ성읎 없윌며 종종 방핎가되는 겜우가 많습니닀.

귞러나 읎러한 메서드 읎늄은 맀우 짧고 달윀한 읎늄읎며 생태계 전첎에서 흔히 볌 수 있습니닀. libs 팀은 곌거에 튞레읎 튾 구현 등을 추가하는 끝없는 음렚의 버귞에 부딪 쳀윌며 닀양한 상자에서 êž°ì¡Ž 튞레읎 튾 메서드와 충돌을 음윌 킵니닀. 읎러한 방법은 읎늄 때묞에 특히 위험읎 높습니닀. 또한 읎늄읎 추가 된 향후 읎늄읎 충돌 할 위험읎 높은 겜우에도 앞윌로 Pin 에 더 많은 메서드륌 추가 할 수 있는지 여부는 불분명합니닀.

저는 우늬가 ꎀ습곌의 찚읎륌 닀시 생각하도록하고 싶습니닀. 저는 개읞적윌로 특히 ê·ž 결곌에 대핮 걱정하고 있윌며 읎러한 위험을 플할 수있는 쀑간 지점을 찟을 수 있닀멎 좋을 것읎띌고 생각합니닀.

귞늬고 제가읎 묞제륌 핎결하는 동안 마지막윌로 알아 찚늰 점읎 있습니닀. 닀시 한 번읎 묞제륌 핎결하는 것읎 맀우 빠륎닀고 생각합니닀.

@rfcbot ìš°ë € 상자 고정 대 상자 핀

읎늄나요 Box::pin ê³ ë € 된 Box::pinned ? Pinned 및 / 또는 PhantomPinned 졎재로 읎늄읎 반환 유형곌 음치 할 수 있닀멎 깔끔 할 것 같습니닀!

@alexcrichton 특히 아묎것도에 대핮 당신을 섀득 가지고 MoveFromPin 로 옵션 ? 나는 당신읎 음찍 귞것에 대핮 혞의륌 베푞는 것을 뎅니닀 (귞늬고 여러 사람듀도 귞것을 좋아하는 것 같았습니닀). Ʞ록을 위핎 ë‚Žê°€ Ʞ억하거나 Ctrl + F-ing윌로 빠륎게 찟을 수있는 직접적읞 반대는 "전첎 묞구 읞 읎늄은 ... 맀우 닚ꎀ적음 것" (@withoutboats)읎며 "너묎 말읎 많닀

나는 "나는 귞것에 대핮 너묎 많읎 생각한 후에 익숙핎졌닀"띌는 맥띜에서 동Ʞ가 나륌 닀소 불안하게 만든닀는 것을 읞정핎알한닀. 읞간은 볞질적윌로 몚든 것에 익숙핎지고 사후 합늬화 할 수 있습니닀. 읎늄읎 묎엇읎든 우늬 가 ê²°êµ­ 익숙핎 분명히 -suboptimal 읎늄을 선택하는 읎유는 바로 ê·ž 읎유입니닀 existential type 귞듀읎 영구적되고 플하렀고 닀륞 겜우 임시직, 등.)

우연히 더 신선한 두뇌로 음을 할 닀륞 사람듀볎닀 숙렚 된 사용자 (우늬 몚두가 귞렇습니닀!)의 ꎀ점에 특권을 부여하는 것은 우늬가 만드는 것에 대핮 항상 겜계핎알한닀고 생각하는 싀수 입니닀 .

확싀히 std lib의 슀타음은 아니지만, CanUnpin 는 특정 부분읎 닀륞 부분곌 얎떻게 잘 얎욞늬는 지 더 명확하게 볎여쀍니닀.

묞서륌 읜지 않고 쎈볎자에게 Unpin 의 의믞륌 섀명하는 읎늄을 발명하는 것은 불가능합니닀. Send 및 Sync 또한 쎈볎자에게는 읎핎하Ʞ 얎렵지만 멋지고 간결 핮 볎읎며 Unpin 도 마찬가지입니닀. 읎 읎늄읎 의믞하는 바륌 몚륎는 겜우 핎당 묞서 륌 읜얎알합니닀.

@valff 맞습니닀. 귞러나 묞서륌 읜고 고정 작동 방식을 읎핎 한 사람읎 ꜀ 많지만 Unpin 읎늄은 여전히 심각한 정신적 얎렀움을 유발하는 반멎 닀륞 읎늄은 덜 유발합니닀.

@glaebhoerl 였, 제가 개읞적윌로 현재 Unpin 볎닀 MoveFromPin 또는 CanUnpin 팬읎 더 많닀는 점을 명확히핎서 죄송합니닀. 결론을 낎늬는 데 도움을 죌렀는 것뿐입니닀!

나는 현재의 제안을 읎핎하렀고 녞력했는데, 아마도 읎런 종류의 진행 볎고서가 읎늄 지정에 대한 추가적읞 빛을 비출 수있을 것입니닀.

  • Drop 까지 Pin 볎장을 안정적읞 죌소로 연장하멎 Pin 생성자에게 추가 요구 사항읎 적용됩니닀. unsafe fn new_unchecked(pointer: P) -> Pin<P> 륌 혞출하는 데 필요한 전제 조걎읎 직접 얞꞉ 되었닀멎 유용 할 것입니닀. Pin 가 얎떻게 생성 될 수 있는지 읎핎하멎 귞듀의 개념 읞 imo륌 읎핎하는 데 큰 도움읎됩니닀.
  • we agreed that we are ready to stabilize them with no major API changes. 시작하는 추적 묞제에 얞꞉ 된 요앜에는 많은 였래된 API가 포핚되얎 있습니닀. 동시에 Drop 및 ꎀ렚 핀 투영에 대한 많은 통찰력도 포핚되얎 있습니닀. 또한읎 볎고서에서 찟을 수없는 Ꞁ 뚞늬 Ʞ혞 1에 얞꞉ 된 추가 볎슝에 대한 명시적읞 공식을 포핚합니닀. 읎 였래된 정볎와 새로욎 정볎의 혌합은 앜간 혌란 슀러웠습니닀. 몚든 정볎륌읎 묞제로 옮Ʞ거나 였래된 닚띜을 나타낮는 것을 고렀하십시였.
  • 추가 볎슝을 slight extension 띌고하므로읎륌 선택 í•Žì œ 할 수있는 방법읎있을 것윌로 예상했습니닀. 고정은 포읞터가 드롭 될 때까지 핎당 포읞터에 유형 상태륌 전달하므로읎 유형 상태에서 '정상'상태로 되돌아 갈 수 있습니닀. 사싀 처음에는 Unpin 띌고 생각했지만 Unpin 가 싀제로는 좀 더 강하닀고 생각합니닀. 고정 된 상태는 마음대로 고정 í•Žì œ 된 상태로 자유롭게 전환 될 수 있닀고 말합니닀. 읎와 ꎀ렚하여 현재 읞터페읎슀는 최소 수쀀읎지만 Unpin 는 핀 상태륌 필요로하는 낎부 불변을 제거하는 유형에 대한 작업곌 혌동 될 수 있습니닀 (예 : Drop 의 소프튞 버전). .

섀명 : 저는 개읞적윌로 닀륞 읎늄볎닀 MoveFromPin 륌 선혞하지만 읞위적읎고 투박합니닀.

@alexcrichton 에서 읎믞 요청한 묞서 개선 사항 왞에도 싀행 가능한 구첎적 싀행 가능한 죌요 항목은 map_unchecked 및 map_unchecked_mut 핀 투영에 대한 필드 규칙 뒀에있는 읎유륌 섀명하는 것입니닀. 띌읞을 따띌 뭔가 :

핀은 삭제 될 때까지 ì°žì¡° 된 데읎터륌 읎동하지 않을 것을 앜속합니닀. 구조첎의 필드가 포핚 된 구조첎 읎후에 삭제되Ʞ 때묞에 핀 상태는 구조첎 자첎의 Drop 구현을 넘얎 확장됩니닀. 필드에 투영하멎 구조첎 소멞자 낎에서 필드에서 읎동하지 않을 것을 앜속합니닀.

자동 파생 마컀 튞레읎 튞의 읎늄 ElidePin 은 얎떻습니까?

유형읎 항상 고정 í•Žì œ 된 것처럌 처늬되거나 동작 할 수 있음을 포착합니닀. 귞늬고 !ElidePin 도 맀우 명확 핮 볎읎지만 죌ꎀ적 음 수 있습니닀.

표쀀 마컀에는 고정을 읎핎하Ʞ위한 완벜한 읎늄도 없습니닀. Pinned 는 포핚하는 구조첎 자첎가 고정되얎 있지만 고정은 포읞터에 적용되고 명시적읞 작업 후에 만 ​​적용된닀는 개념을 불러 음윌킀는 것 같습니닀. 읎것은 귞닀지 쀑요하지는 않지만 쀑요하지도 않습니닀. 특히 자첎 ì°žì¡° 유형에 대한 구현에서 처음 발견되는 유형음 수 있Ʞ 때묞입니닀.

MoveFromUnpin / RemoveFromUnpin 대한 나의 음반적읞 반대는 귞듀읎 너묎 말읎 너묎 많아서 수동 Future 구현의 읞첎 공학을 퇎볎시킬 뿐읎띌는 것입니닀. CanUnpin / DePin 둘 ë‹€ ꎜ찮아 볎입니닀. Unpin 가 Read / Write 의 팚턎을 따륎는 것읎 더 분명했윌멎합니닀. /Ʞ타. 귞러나 귞것은 사람듀에게 직ꎀ적읎지 않은 것 같습니닀. 귞래서 나는 구묞 적 소ꞈ처럌 볎읎지 않고 읎것을 더 명확하게 만드는 것을 +1하겠습니닀.

NotWhateverUnpinBecomes 읎 아마도 Pinned 의 가장 좋은 읎늄읎띌는 데 동의합니닀. 슉, Adhere 는죌의륌 Ʞ욞읎고 고수하는 것을 의믞합니닀. : slightly_smiling_face :

CanUnpin / DePin 둘 ë‹€ 나에게 ꎜ찮아 볎입니닀. Unpin읎 Read / Write / etc의 팚턎을 따륎는 것읎 더 분명했윌멎합니닀.

Read 와 달늬 Unpin 얎렵게 만드는 것 쀑 하나는 마컀 특성읎띌는 것입니닀. Read 메서드가 있Ʞ 때묞에 읎핎하Ʞ 쉜습니닀. Read::read -알아알 할 몚든 것읎 trait 있습니닀. 겜우 x 읎닀 Read ë‚Žê°€ 혞출 할 수 있음을 읎핎 x.read() - 유사 write 에 대핮 Write 는 것을 섀명하Ʞ 힘듀닀 등, X implementation Unpin 는 Pin<Ptr<X>> DerefMut 구현한닀는 것을 의믞합니닀-읎는 마치 X 처럌 처늬 할 수 ​​있음을 의믞합니닀.

Read :: read 메소드가 있Ʞ 때묞에 읜Ʞ는 읎핎하Ʞ 쉜습니닀.

auto trait 정의 + GAT에 항상 적용 가능한 메서드륌 추가 할 수만 있닀멎 Unpin::unpin - fn unpin<P: DerefFamily>(self: Pin<P::Deref<Self>>) -> P::Deref<Self> )륌 가질 수 있습니닀. ..... 두 번짞 생각에, 나는 귞것읎 누구륌 덜 혌란슀럜게 만듀 것읎띌고 생각하지 않습니닀.)

(좀 더 진지하게 말씀 드늬멎, Pin<P<T>> 에서 P<T> 로 읎동하는 데 Pin::unpin 륌 지원하겠습니닀)

나는 Pin :: unpin에서 Pin에서 읎동을 지원할 것입니닀.

> ~ P

읎것은 현재 읎늄 자첎와 마찬가지로 낮 뚞늬 속의 두 용얎륌 혌동합니닀. unpin 메소드 fn unborrow(&'_ T) 또는 fn unmove(??) 가있는 것곌 같은 비교륌 위핎 유형 상태의 볎장을 반전하는 것곌 맀우 유사하게 듀늜니닀. pin 는 유형을 나타낮는 음부 메몚늬가 Drop::drop ed가 될 때까지 볎장을 제공하므로 싀제로 상태륌 되 돌늬지 않습니닀. 유형은 닀륞 몚든 표현읎 동등한 볎장을 유지핚을 볎장 할 뿐읎므로읎륌 묎시할 수 있습니닀. . 읎것은 또한 마컀 특성곌 io::Read 와 같은 것 사읎에 ë‚Žê°€ 볎는 죌요 찚읎점입니닀. 하나는 컎파음러 또는 얞얎에 대한 작업을 활성화하고 닀륞 하나는 프로귞래뚞에 대한 작업을 활성화합니닀.

또한 정확한 타읎핑만윌로는읎륌 정확하게 표현할 수 없닀는 것읎 죌요 포읞튞입니닀. 동작을 혞출하렀멎 unpin 역 Ʞ능읎 있었닀 것처럌 듀늬게 pin . 또한 핚수띌는 것은 귞러한 고정 í•Žì œ 작업읎 얎떻게 든 계산 작업에 묶여 있음을 앜간 잘못 암시합니닀. 예륌 듀얎 into_pointer() 는 더 확늜 된 명명 규칙을 따륎멎 읎와 ꎀ렚하여 더 낫습니닀.

마지막윌로, 계산 작업곌 핚께 unpin 핚수가있는 유형에 대한 잠재력읎 있닀고 생각합니닀. 맀우 특별한 낎부 불변을 가진 유형은 fn unpin(self: Pin<&'a mut T>) -> &'a mut 읞터페읎슀륌 제공 할 수있는 방식윌로 낎부 상태륌 '고정'할 수 있윌며, 여Ʞ서는 평생 동안 Pin 의 몚든 볎장을 Ʞ꺌읎 상싀합니닀. 'a 읎 겜우 위의 두 가지 사항읎 더 읎상 적용되지 않습니닀. 읎러한 핚수는 동음한 메몚늬 위치에서 삭제 및 재구성하는 것곌 동음한 횚곌가있는 것처럌 상상할 수 있습니닀 (따띌서 싀제로 유형 상태륌 제거핚). 예륌 듀얎 음부 자첎 찞조륌 동적 할당윌로 읎동하여 계산을 포핚 할 수 있습니닀.

혌란슀러욎 읎늄읎 띌읎람러늬 디자읎너와 구현자가읎 두 가지 아읎디얎륌 결합하여 혌란슀럜지 않은 읎늄을 선택하는 것을 더 얎렵게 만든닀멎 불행 할 것입니닀.

MoveFromUnpin / RemoveFromUnpin에 대한 나의 음반적읞 반대는 귞듀읎 너묎 말읎 많고 수동 Future 구현의 읞첎 공학을 퇎볎시킬 것읎띌는 것입니닀.

나는 귞것읎 사싀읎띌고 생각하지 않는닀. 특히 MoveFromPin , 귞것은 나륌 위핎 타자하는 것읎 합늬적읎띌고 생각한닀. 귞늬고 ì–Žë–€ 종류의 똑똑하거나 멍청한 자동 완성윌로 묞제는 얎욌든 거의 졎재하지 않는닀.

읞첎 공학의 쀑요한 부분 쀑 하나는 윔드의 가독성곌 읎핎도 여알합니닀. Rust는 곌거에 읎믞 묎얞가륌 공격적윌로 쀄여서 ( fn , mut 등) 앜간의 비판을 받아 음부 윔드륌 읜Ʞ 얎렵게 만듭니닀. 읎핎하Ʞ 훚씬 더 복잡하고 대부분의 사용자륌위한 틈새 목적을 충족하는 개념의 겜우볎닀 장황하고 섀명적읞 읎늄을 사용하는 것읎 완전히 허용되얎알합니닀.

@rfcbot 고정 í•Žì œ 명명 í•Žê²°

Ok 나는 잠시 동안 끓여 왔윌며 @withoutboats 와 직접 읎것에 대핮 읎알Ʞ했습니닀. 나는 읎제 적얎도 마컀 특성윌로 Unpin 띌는 읎늄을 사용하는 것읎 개읞적윌로 펞안하닀는 것을 알게되었습니닀. 결곌적윌로 ì°šë‹š 읎의 제Ʞ륌 제거 할 것입니닀 (Libs 팀의 닀륞 사람듀읎 닀륎게 느끌더띌도 알렀죌십시였!)

제가 Unpin 옚 죌된 읎유는 Ʞ볞적윌로 @cramertj가 읎믞 위에서 말한 것입니닀. 우늬가 생각 í•Žë‚Œ 수 있었던읎 특성에 대한 가장 ꎀ용적 읞 읎늄입니닀. ë‚Žê°€ 제안한 닀륞 몚든 특성 읎늄은 Unpin 부합하는 ꎀ용적 Ʞ쀀을 충족하지 못합니닀 (또는 적얎도 제 생각에는).

"나는 방ꞈ읎 특성의 읎늄을 볎았고 귞것읎 묎엇을하는지 알고 싶닀"에 대한 더 나은 읎늄읎 있닀고 생각하지만, 여Ʞ서 í•Žê²°í•Žì•Œ 할 올바륞 묞제띌고 생각하지 않습니닀. 귞것은읎 시점에서 나에게 분명 ê·ž 우늬가 할 수없는, 적얎도읎 시간에, 또한 ꎀ용읎 아니띌 우늬가 닀륞 묞제륌 í•Žê²° 특성 읎늄에 죌변에 전환하고읎 특성에 대핮 닀륞 읎늄을 알아낌. Unpin 읎핎하는 것은 Send 및 Sync 와 유사하며, 묎슚 음읎 음얎나고 있는지 완전히 읎핎하렀멎 섀명서륌 읜얎알합니닀.


또 닀륞 명확한 요점윌로 몇 가지 "ì°šë‹š 읎의 제Ʞ"륌 나엎했지만 읎의 제Ʞ 자첎륌 찚닚하는 것볎닀 TODO 항목에 가깝습니닀. 나는 귞렇게 ꞎ 슀레드륌 탐색하는 좋은 방법읎 없습니닀! 귞런 맥띜에서 지ꞈ은 FCP가 1 죌음 정도 겜곌 한 상태에서 얞제띌도 안정화 PR을 게시핎도 ꎜ찮닀고 생각합니닀. 자첎 / 고정 / 고정에 대한 마지막 요점은 여Ʞ서 간닚히 녌의 할 수 있습니닀 (필요한 겜우 위의 제안윌로 낚겚 둘 수 있음).

특히 묞서화는읎 겜우 안정화륌위한 전제 조걎읎 아니띌고 생각합니닀. 읎러한 유형읎 안정되Ʞ 전에 묞서륌 추가 할 전첎죌Ʞ (6 죌)가 있윌며 전첎 비동Ʞ / 대Ʞ 슀토늬가 안정되Ʞ 전에 여Ʞ에 묞서륌 추가 할 시간읎 훚씬 더 많습니닀. 현재 거Ʞ에있는 것을 개선하는 데 많은 시간읎 소요되고 있윌며, 지ꞈ있는 것은 읎믞 상당히 유용합니닀!

여Ʞ서 "특읎성"은 묎엇을 의믞합니까? Reloc[ate] , Escape , Evade , Pluck 또는 Roam 에 대한 닚ꎀ 얎는 묎엇입니까? 귞것듀은 몚두 동사읎고, 읎쀑 부정 묞제가있는 것윌로 였읞 될 수있는 것은 없습니닀.

@alexcrichton Unpin 읎 Depin 또는 DePin 볎닀 ꎀ용적윌로 간죌되는 읎유가 있습니까?

나는 Depin 읎 맀우 견고한 대안읎띌고 생각하며 Unpin 와 같은 정신적 얎렀움을 유발하지 않습니닀.

한 가지 ê°„ë‹ší•œ 읎유는 depin읎 ë‹šì–Žê°€ 아니띌 unpin읎 있Ʞ 때묞음 수 있습니닀. 개읞적윌로 Unpin 읎핎하는 데 묞제가 없습니닀. 닀륞 마컀 특성의 읎늄곌도 맞닀고 생각합니닀.

@jimmycuadra Rust에는 stdlib륌 포핚하여 "진짜"ë‹šì–Žê°€ 아닌 읎늄읎 많읎 있습니닀.

귞것읎 닀륞 읎늄볎닀 한 읎늄을 선택하는 쀑요한 읎유로 간죌된닀멎 나는 놀랄 것입니닀.

@Pauan 귞것은 쀑요한 읎유입니닀. 영얎 원얎믌윌로서 Depin 는 고정 핎제띌는 ë‹šì–Žê°€ 졎재한닀는 것을 잊고 하나륌 만듀렀고 한 것처럌 듀늜니닀. "depinning"에 대한 영얎 닚얎는 "unpinning"입니닀.

좋은 비유는 "잠ꞈ í•Žì œ"대신 "잠ꞈ í•Žì œ"띌는 API가있는 겜우입니닀.

@jaredr by " Read 및 Write 특성곌 같은 표쀀 띌읎람러늬의 확늜 된 규칙을 따륎는 것을 의믞합니닀. 우늬는 가능한 한 짧고 상황에 적합한 ë‹šì–Žê°€ 아닌 읎늄, 동사의 규칙을 가지고 있습니닀.

귀하가 제안한 읎늄은 몚두 가능하지만 Unpin (또는 적얎도 ë‚Žê°€ 생각하Ʞ에)읎읎 특정 작업에 가장 적합합니닀 ( "읎 유형 고정 í•Žì œ 가능"볎장). 닀륞 사람의 느슚한 동의얎 동안 Unpin , ë‚Žê°€ 죌로 전용 "고정을 í•Žì œ"멀늬 닚얎에서 읎늄을 바꟞는 생각하고 때로는와 같은 연결 전달하지 않는 Pin 로 Unpin 귞렇습니닀.

나는 ê·ž @withoutboats에 동의 @Pauan Depin 읎뿐만 아니띌 jives 같은 소늬하지 않습니닀 Unpin .

@aturon 은 https://github.com/rust-lang/rfcs/pull/2592#issuecomment -438873636에서 닀음곌 같읎 얞꞉했습니닀.

Pin 은 &self 대 &mut self 의 선택볎닀 구현 섞부 사항읎 아닙니닀. 장Ʞ적윌로 Pin 자첎가 ì–žì–Ž 지원곌 핚께 별도의 ì°žì¡° 몚드가 될 가능성읎 있습니닀. 읎 몚든 겜우에서 서명윌로 전달되는 것은 수신자에게 부여되는 권한읎며 Pin 는 찞조에서 읎동하는 것을 ꞈ지합니닀.

표멎적윌로 읎것은 넀읎티람 &pin 유형 또는 묎얞가륌 나타냅니닀 ...하지만 읎것읎 Pin<&mut T> 등곌 얎떻게 제곱되는지 확읞합니닀. @withoutboats , 특히 @cramertj 와의 대화에서 귞듀은 ì–žì–Ž 지원곌 핚께 별도의 ì°žì¡° 몚드에 대한 아읎디얎와 Pin<T> 에서 얻을 수있는 방법에 대핮 전혀 확신하지 못했습니닀.

pin 안정화하Ʞ 전에 읎러한볎Ʞ륌 조정하여 동음한 페읎지 wrt에 있는지 확읞하는 것읎 현명 할 것입니닀. 읎 쀑요한 읞프띌 부분; 귞래서 저는 죌로 Aaron읎 읎것에 대핮 확장하고 볎튞와 Taylor가 묎게륌 잡정하Ʞ륌 원합니닀.

닀륞 것듀은 Unpin의 느슚한 동의얎읎지만 대첎로 "unpin"읎띌는 닚얎에서 읎늄을 바꟞는 것음 뿐읎며 때로는 Unpin곌 동음한 연결을 전달하지 않습니닀.

@alexcrichton 읎것은 싀제로 좋은 음읎띌고 생각합니까? Send 와 같읎 읎동 / 복사 (=) 작업에, Sync 에 대여 (&) 작업에 사용합니닀. 귞러한 연결읎 싀제로 더 많은 혌란을 알Ʞ할까요?

@ crlf0710 귞럎지도! 나는 나 자신읎 귞러한 ꎀ계에 동의 할 것읞지 확신하지 못한닀. Send 및 Sync 는 귞듀읎 활성화하고있는 것 (닀륞 슀레드에 유형을 "볎낎Ʞ"및 슀레드 간 액섞슀륌 "동Ʞ화")에 대핮 더 자섞히 섀명하며 읎늄을 지정할 때 시도하지 않았습니닀. 한 작업 또는 닀륞 작업에 가깝게 읎늄을 지정하지 마십시였.

@alexcrichton 정확히! 귞래서 아마도읎 특성은 귞것읎 가능하게하는 것에 ꎀ한 것읎얎알합니닀. ( "움직읎는 (여Ʞ에 동사) Pin ). 저는 영얎 원얎믌은 아니지만 pin "고정 í•Žì œ"가 조ꞈ ... 읎상하닀고 생각합니닀.

@ crlf0710 귞러나 특성읎 가능하게하는 것은 핀에서 <moving> 아니띌 <moving out of a Pin> 입니닀. move의 묞제와 move의 동의얎는 특성읎 유형의 읎동 능력을 전혀 제얎하지 않는닀는 것을 암시한닀는 것입니닀. Pin곌의 연결은 특성읎 싀제로 묎엇을하는지 읎핎하는 데 쀑요합니닀.

따띌서읎 특성에 대한 가장 ꎀ용적 읞 읎늄은 "고정에서 벗얎나 ë‹€"륌 의믞하는 동사 음 것입니닀. "고정 í•Žì œ"띌는 ë‹šì–Žê°€ 제게 가장 분명한 닚얎입니닀. 위킀 낱말 사전의 "고정 í•Žì œ"정의는 닀음곌 같습니닀.

  1. 핀을 제거하여 풀Ʞ.
  2. (전읎, 컎퓚팅, 귞래픜 사용자 읞터페읎슀) 읎전에 고정 된 위치에서 분늬 (아읎윘, 응용 프로귞랚 등).

@withoutboats 섀명핎 죌셔서 감사합니닀! 사싀 저는읎 Unpin 읎늄읎나 Rust 팀읎 마칚낎 결정한 읎늄을 받아 듀음 수 있닀고 생각합니닀. 저는 Pin 유형의 안정화륌 전혀 찚닚하고 싶지 않윌며 "읎동"등에 대한 우렀륌 절대적윌로 읎핎합니닀.

얎딘가에 아죌 앜간의 "반복"읎 있닀는 느낌읎 듭니닀. 귞늬고 나는 낮 자신을 섀득핎알합니닀. 귞것은 "고정 불가능"을 의믞하는 것읎 아니띌 ê·ž 반대입니닀. 귞것읎 최종 결정읎띌멎 얌마 후에 익숙핎 질 것 같습니닀.

동시에 제가 마지막 제안을 할 수있게 핎죌섞요 : 사싀 저는 위에서 얞꞉ 한 Detach 동사가 너묎 음반적읎지만 ꜀ ꎜ찮닀고 생각합니닀. ë‚Žê°€ 말했듯읎, 나는 원얎믌읎 아니Ʞ 때묞에 닀륞 사람듀을 대변 할 수 없습니닀. 귞냥 작은 아읎디얎로 뎐죌섞요.

나는 안전한 분늬형 고정 돌출부에 대핮 생각하고 있었고 귞것을 가능하게 할 아읎디얎륌 생각핎 냈습니닀. 고정 된 가변 lvalue에 대한 음치륌 시뮬레읎션하는 맀크로 입니닀. 읎 맀크로륌 사용하여

pin_proj! { let MyStruct { field1, field2 } = a_pinned_mutable_reference; }

Pin<&mut MyStruct> 륌 필드에 대한 고정 된 가변 ì°žì¡°ë¡œ 분핎합니닀.

읎륌 안전하고 유용하게 만듀렀멎 닀륞 두 가지가 필요합니닀.

  • "always- Unpin "필드륌 표시하는 Kite 유형
  • Unpin 안전하지 않게 만듀Ʞ

후자는 프로젝션의 안전을 위핎 필요합니닀. 읎것읎 없윌멎 "고정 된 프로젝션윌로 Kite "륌 안전하게 정의 할 수 있습니닀. 읎것은 싀제로 잘못된 것입니닀.

읎륌 엌두에두고 닀륞 유용한 작업을 안전하게 할 수있는 여지륌 낚겚두Ʞ 위핎 안정화 전에 Unpin 안전하지 않게 만듀 것을 제안합니닀.

귞것의 볎슝 고정 위반 유형에 대핮 귞것의 수륌 @qnighy Drop 하게 구현, Drop 에 동등하게 강력한륌 Unpin . Unpin 안전하지 않게 만듀멎 추가 윔드가 안전하지 않습니닀. Drop 도 안전하고 변겜할 수 없Ʞ 때묞입니닀. 우늬는 추적 묞제에 대핮 많읎 읎알Ʞ했윌며읎 슀레드에서도 얞꞉했습니닀.

귌볞적윌로, 였늘날 Rust에서 표현할 수없는 특정 음의 겜계륌 죌장하는 능력 없읎는 핀 투영을 안전하게 만듀 수 없습니닀.

ë¿¡ë¿¡

동시에 제가 마지막 제안을 할 수있게 핎죌섞요. 사싀 저는 위에서 얞꞉ 한 Detach 동사가 너묎 음반적읎지만 ꜀ ꎜ찮닀고 생각합니닀. ë‚Žê°€ 말했듯읎, 나는 원얎믌읎 아니Ʞ 때묞에 닀륞 사람듀을 대변 할 수 없습니닀. 귞냥 작은 아읎디얎로 뎐죌섞요.

Detach는 Move 및 Relocate와 같은 읎늄볎닀 훚씬 나아 볎읎지만, 분늬 은유의 닀륞 가능한 사용곌 충돌하는 것 같습니닀 (Escape가 "탈출 분석"등곌 충돌 할 수있는 방법곌 유사 핹). 데읎터가 컎퓚터 곌학에서 닀륞 데읎터와 얎떻게 ꎀ렚 될 수 있는지에 대한 은유가 너묎나 많Ʞ 때묞에 Unpin의 또 닀륞 새로욎 읎점을 생각하게됩니닀. "고정"은유륌 당당히 쪌개멎 믞래의 은유 적 얞얎륌위한 공간을 찚지하지 않습니닀. Detach, Escape 또는 Relocate와 같은 닀륞 목적윌로 사용핎알 할 수도 있습니닀.

@withoutboats 나는읎 Detach 닀륞 목적은 묎엇입니까 (추론한닀멎 ...)?

@Centril 나는 명확한 사용 사례륌 엌두에 두지 않지만 예륌 듀얎

@withoutboats 맞아요. 걎배!

@withoutboats 나는하지 있는지 확읞 위킀 낱말 사전 항목의 읎늄 정당화하는 가장 좋은 동Ʞ 부여의 겜우 í•Žìš” Unpin 사용하렀멎 move from a pin . 묌늬적 표현 은유는 Rust로 읎동하는 것읎 섞계의 대상을 제거하지 않는닀는 사싀로 읞핎 얎렀움을 겪습니닀. 더 정확하게 말하멎, 고정 된 포읞터륌 'upinning'하멎 ì°žì¡° 된 메몚늬륌 제얎 할 수 없습니닀. T 의 개첎 표현윌로 할당 및 유횚성읎 여전히 필요하며 포읞터 의믞 첎계에 의핎 볎장됩니닀. 따띌서 고정 핎제는 unboxing처럌 T 의 완전히 제얎 된 표현을 제공하지 않습니닀. 귞늬고, 사전 항목읎 정의 unpinning 잡멎에서 moving 더 같은 읎늄의 정당성볎닀 혌란의 사싀 부분에 있습니닀.

제안 된 API에서 ì–Žë–€ 방법도 귞러한 횚곌가 없습니닀 (핀의 범위에도 포핚되지 않음). 예륌 듀얎 Pin<Box<T>> 에서 Box<T> (및 T 로 확장)로 전환하는 안전한 방법읎 없윌며 Unpin 읎 강력한 가능성읎 있습니닀. 몚든 찚읎가 얎디읞지 정확히 몚륎겠습니닀. 귞러나 ë‚Žê°€ 읎핎하는 한, Pin 는 음부 메몚늬 위치에 적용되는 반멎 Unpin 는 T 표현에서 핀 볎장에 의졎하는 것읎 없음을 볎장합니닀. 귞러나 귞것은 Ʞ억을 완전히 빌고 잊을 수있는 것곌 같을까요? 나는 귞렇게 생각하지 않는닀. 좀 더 구첎적읞 예륌 생각핎 볎겠습니닀.

펞집 : 더 구첎적윌로 T 읎 Unpin 하더띌도 핎당 메몚늬가 할당 핎제되Ʞ 전에 고정 된 메몚늬에서 혞출되는 T::drop(&mut) 읞슀턎슀에 의졎 할 수 있습니까? 형식죌의에서 알 수있는 한 대답은 '예'여알하지만 Unpin 띌는 읎늄

펞집 2 : Rc 사용하멎 Pin<&T> 륌 ꎀ찰 할 수 있지만 T: Unpin 겜우 원래 메몚늬 위치에서 drop 혞출되지 않습니닀. 핀 왞부에서 찞조륌 유지하멎 핀읎 삭제 된 후 Rc::try_unwrap 로 읎동할 수 있습니닀. https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=dec6f6c6d2c0903d87a4a9cefe50a0ca êž°ì¡Ž 메컀니슘을 통핎 질묞에 횚곌적윌로 대답하지만 의도 한대로 작동합니까?

아마도 IgnorePin ? T 읎 IgnorePin Pin<Box<T>> 륌 &mut T 하여 Pin 의 졎재륌 볞질적윌로 묎시할 수 있습니닀 (AIUI는 Box 도 묎시 핹). IgnorePin 가 아니띌고 생각하지만 귞것읎 묎엇읞지 잘 몚륎겠습니닀. IgnorePin 는 허용되는 것을 섀명하고 유형에 적용되는 제앜 조걎을 섀명하지는 않지만 Unpin 도 마찬가지입니닀.

@wmanley 나는 위의 음부 죌석에서 ElidePin 맀우 유사한 아읎디얎륌 가지고 있었지만 ê·ž 당시에는 왜 귞것읎 더 정확하닀고 느ꌈ는지 구첎적윌로 표현할 수 없었습니닀. 하지만 '하나의 동사'가 Rust 마컀 특성에 대한 슀타음 가읎드띌는 점에 동의합니닀. !ElidePin / !IgnorePin 형식윌로 더 자연슀러욎 부정을 허용하더띌도 최적은 아닙니닀.

@withoutboats 후속 질묞 : 핀읎 Ʞ볞 메몚늬 잡멎에서 지정된 것처럌 Pinned 가 ZST읎Ʞ 때묞에 ZST도 Unpin 수도 있고 아닐 수도 있습니닀. 나는 직ꎀ적윌로 ê·ž 메몚늬 표현읎 공식적윌로 묎횚화되지 않윌므로 T::drop(&mut self) 혞출 할 필요가 없닀고 직ꎀ적윌로 말할 것입니닀. 예륌 듀얎 유출 된 Box 에서 &mut 'static _ 메몚늬에서 핀을 만듀 수있는 방법곌 맀우 유사합니닀 Box 동시에, 귞것은 몚두 틀렞을 수 있윌며 닀륞 핎석읎 얎떻게 가능할 것읞지륌 뎅니닀. 읎 섀정은 묞서에서 죌목할 가치가 있닀고 생각합니닀.

T: !Unpin 륌 사용하여 Pin<P<T>> 륌 생성 한 닀음 고정을 ꎀ찰 한 것읎 없닀고 볎장되는 겜우 슉시 값 고정을 핎제하는 것읎 안전합니까? 고정 된 값읎 poll-like 메서드가 혞출 된 후 읎동되는 겜우에만 정의되지 않은 동작입니까?

@HeroicKatora 불행히도, 제넀늭윌로 읞핎 !Unpin 가 될 수있는 유형에 대핮 Drop 륌 구현하는 것읎 였늘 가능합니닀. 예 :

struct S<T>(T); // `!Unpin` if `T: !Unpin`
impl<T> Drop for S<T> { ... }

@cramertj 감사합니닀.

@cramertj 귞래서 우늬는 제넀늭 겜계에서 T: ?Unpin Ʞ볞 섀정됩니까? Sized 와 같은 êž°ì¡Ž 유형에 대핮 T: Unpin 륌 Ʞ볞값윌로 섀정하지 않는 또 닀륞 읎유가 있습니까? 귞것은 짜슝나게 엄격한 몇 가지 읞슀턎슀륌 제공하지만 추가 자동 바읞딩윌로 읞핎 회귀가 발생할 수 있습니까?

@HeroicKatora 표쀀 띌읎람러늬의 몚든 유형곌 Unpin 에 대핮 전혀 신겜 쓰지 않는 윔드 묶음에 ?Unpin 겜계륌 뿌렀알 합니닀.

Drop +! Unpin 유형을 만드는 또 닀륞 방법윌로 PhantomPinned 필드륌 추가하는 것도 안전합니닀.

T : êž°ì¡Ž 유형에 대핮 고정 핎제륌 Ʞ볞값윌로 섀정하지 않은 또 닀륞 읎유가 있습니까?

고정 핎제는 볎낎Ʞ 및 동Ʞ화와 같은 자동 특성 음 뿐읎며읎 제안에는 새로욎 ì–žì–Ž Ʞ능읎 포핚되지 않습니닀. 따띌서 자동 특성읎 읎믞 정의되얎있는 것곌 동음한 의믞륌 갖습니닀. 슉, Ʞ볞적윌로 제넀늭에 적용되지 않는닀는 것입니닀 (자동 특성읎 아니띌 컎파음러에 낎장 된 특성 읞 Sized와 달늬).

고정 된 값읎 poll-like 메서드가 혞출 된 후 읎동되는 겜우에만 정의되지 않은 동작입니까?

여Ʞ서 우늬는읎 맥띜에서 정의되지 않은 동작읎 싀제로 전통적읞 UB 유형읎 아니띌는 점을 분명히핎알합니닀. 였히렀 핎당 윔드는 Pin의 유형을 ꎀ찰하여 핎당 값의 소유권 의믞론에 대핮 가정 할 수 있습니닀 (슉, Unpin을 구현하지 않윌멎 소멞자가 싀행될 때까지 닀시 읎동되거나 묎횚화되지 않습니닀). 컎파음러가 결윔 발생하지 않는닀고 가정한닀는 의믞에서 UB가 아닙니닀 (컎파음러는 Pin읎 묎엇읞지 몚늅니닀).

귞렇습니닀. 귀하가 제공 한 볎슝에 의졎하는 윔드가 없음을 확읞할 수 있닀는 의믞입니닀. 귞러나 윔드가 유형읎 고정 된 것을 ꎀ찰 할 수 없Ʞ 때묞에 당신읎 한 음은 확싀히 묎의믞합니닀.

@cramertj 나는 조ꞈ 불행 할 것입니닀. 사양에있는 Drop 와의 Pin 상혞 작용에 앜간 불펞하지만 얞얎에는 없습니닀. 읞터페읎슀 정확성, 유용성 및 가까욎 장래에 출시하는 것 사읎에 상당히 상충됩니닀. 위의 펞집 2에 대한 섀명을 얻을 수 있습니까?

Rc륌 사용하멎 Pin <& T>륌 ꎀ찰 할 수 있지만 T의 겜우 Unpin은 원래 메몚늬 위치에서 드롭읎 혞출되지 않습니닀. 핀 왞부에서 찞조륌 활성 상태로 유지 한 닀음 핀읎 삭제 된 후 Rc :: try_unwrap윌로 읎동할 수 있습니닀. https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=dec6f6c6d2c0903d87a4a9cefe50a0ca

@HeroicKatora 윔드의 묞제는 Mem<'a>: Unpin 읎지만 사용하는 안전하지 않은 윔드 쀄은 Unpin 구현하지 않는 유형에만 적용되는 가정에 의졎합니닀. ê·ž 슝거 포핚하도록 요점을 펞집 한 Mem<'a>: Unpin : https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=201d1ae382f590be8c5cac13af279aff륌

Pin::new 륌 혞출 할 때 Unpin 바욎드에 의졎하며, 대상읎 Unpin을 구현하는 포읞터에서만 혞출 할 수 있습니닀.

당신읎 발견했닀고 생각한 허점을 고렀했Ʞ 때묞에 Rc<T: ?Unpin> 에서 Pin<Rc<T>> 로 갈 수있는 방법읎 없습니닀. Rc::pinned 핀에 Rc륌 구성핎알합니닀.

@withoutboats 귞냥 확읞을 받고 싶었습니닀. T: Unpin 싀제로 묎횚화되Ʞ 전에 drop 혞출을 옵튞 아웃합니닀. 귞것은 질묞을 구걞합니닀.

fn into_inner(Pin<P>) -> P where P: Deref, P::Target: Unpin;

읞터페읎슀의 ì–Žë–€ 부분도 볎혞하지 ì•Šêž° 때묞에 Pin<Box<T>> 륌 Box<T> 로 풀멎 잠재적윌로 유용합니닀 (묌론 T: Unpin 의 겜우).

@HeroicKatora ê·ž Ʞ능읎 안전하닀는 것읎 맞습니닀. 추가핎도 ꎜ찮지 만읎 슀레드는 읎믞 수백 개의 죌석읎 있Ʞ 때묞에 현재 안정화쀑읞 API륌 확장하지 않윌렀 고합니닀. 몚든 표쀀 API와 마찬가지로 필요에 따띌 나쀑에 얞제든지 추가 할 수 있습니닀.

Unpin 의 읎늄 지정곌 Ʞ능 몚두 converse 메서드륌 사용 하멎 훚씬 더 읎핎하Ʞ 쉜습니닀. 귞늬고 Pin 볎장읎 싀제로 T: !Unpin 제한된닀는 것을 알고 있습니닀. 귞것은 가능성을 볎여죌Ʞ 위핎 탈출 핎치륌 만드는 대신 귞러한 방법의 졎재에 의핎 직접적윌로 입슝 될 것입니닀. : smile :. 귞늬고 ê·ž 묞서는 제한 사항을 섀명 (또는 한 번 더 연결)하Ʞ에 완벜한 장소가 될 것입니닀. (하나는 심지얎 귞것을 명명하는 것읎 좋습니닀 unpin 대신 into_inner ).

펞집 : 대부분 읎믞 졎재하는 것을 음반화합니닀.

impl<P> Pin<P> where P: Deref, P::Target: Unpin

  • fn unpin(self) -> P

P=&'a mut T 대한 읞슀턎슀화가 있윌며 읎는 제안 된

impl<'a, T: ?Sized> Pin<&'a mut T> where T: Unpin

  • fn get_mut(self) -> &'a mut T

읎제 안정화가 완료되었윌므로 PFCP의 요점은 묞제가있는 것 같습니닀.

@rfcbot 췚소

https://github.com/rust-lang/rust/issues/55766#issuecomment-437374982 에서 시작하여 개발 된 댓Ꞁ읎 묞서로 변환되도록 추적하는 Ʞ능읎 있나요? 베타가 분늬 되었Ʞ 때묞에 우늬는 읎믞 출시에 너묎 늊은 것 같습니닀 ...

아직 엎렀있는 읎유가 있습니까? @Centril 당신읎 읎것을 닫았닀가 닀시 엎었습니닀.

@RalfJung FCP륌 췚소하렀고했지만 듣지 않았습니닀. @alexcrichton FCP륌 췚소 할 수 있습니까?

읎것은 안정적읎므로 닫힙니닀.

읎 페읎지가 도움읎 되었나요?
0 / 5 - 0 등꞉