Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

CoerceUnsized

CoerceUnsized는 주로 데이터 컨테이너와 관련됩니다. 구조체(일반적으로 스마트 포인터)가 CoerceUnsized를 구현한다는 것은 그 구조체가 가리키는 데이터가 언사이즈(unsize)된다는 뜻입니다.

CoerceUnsized를 구현하는 타입에는 다음과 같은 것들이 있습니다.

  • &T
  • Arc<T>
  • Box<T>

이 트레이트는 (궁극적으로) 사용자가 작성한 스마트 포인터가 구현하도록 의도되었으며, 어떤 타입이 CoerceUnsized를 구현할 수 있는 조건에 관한 규칙은 이 트레이트의 문서에 설명되어 있습니다.

Unsize

이와 대조적으로, Unsize 트레이트는 언사이즈될 수 있는 실제 타입과 관련됩니다.

Unsize는 컴파일러(즉, 코드 생성)에 타입을 어떻게 언사이즈할지 알려 주지 않고 언사이즈가 허용되는지 여부만 알려 주므로, 사용자가 이를 구현하도록 의도된 경우는 전혀 없습니다. 이는 타입이 어떻게 표현되고 언사이즈되는지를 이해해야 하는 코드 생성과 상당히 밀접하게 연결되어 있습니다.

기본 언사이징 구현

다음에 대해 내장 구현이 제공됩니다.

  • T: Trait일 때(그리고 T: Sized + 'a이며 Trait가 dyn 호환1일 때) T -> dyn Trait + 'a
  • [T; N] -> [T]

구조적 구현

구조적이라고 볼 수 있는 Unsize 구현이 하나 있습니다.

  • TailField<Pi, .., Pj>: Unsize<Ui, .. Uj>가 주어졌을 때 Struct<.., Pi, .., Pj, ..>: Unsize<Struct<.., Ui, .., Uj, ..>>이며, 이는 구조체의 마지막 필드가 제네릭 매개변수 Pi, .., Pj(연속적일 필요는 없습니다)를 언급하는 유일한 필드인 경우 해당 필드를 언사이즈할 수 있게 합니다.

구조체 언사이징 규칙은 둘 이상의 매개변수를 변경하도록(반드시 언사이즈되는 것은 아닙니다) 허용할 수 있으므로 다소 복잡하며, 구조체의 마지막 필드를 기준으로 설명하는 것이 가장 좋습니다.

(튜플 언사이징은 이전에 기능 게이트 unsized_tuple_coercion 뒤에 구현되어 있었으나, 이 구현은 #137728에서 제거되었습니다.)

업캐스팅 구현

내부적으로 “업캐스팅“이라고 불리는 것은 다음 두 가지입니다.

  1. 진정한 업캐스팅 dyn SubTrait -> dyn SuperTrait(아래와 같이 자동 트레이트를 제거하고 라이프타임을 조정하는 것도 허용합니다).
  2. 주(principal) 트레이트를 변경하지 않고2 dyn 트레이트의 자동 트레이트를 제거하고 라이프타임을 조정하는 것: AutoTraits ⊇ NewAutoTraits이고 'a: 'b일 때 dyn Trait + AutoTraits... + 'a -> dyn Trait + NewAutoTraits... + 'b.

(1.)은 dyn 트레이트의 vtable 조정을 포함하는 반면 (2.)는 아무 작업도 하지 않으므로, 이 둘은 서로 다른 연산처럼 보일 수 있습니다. 그러나 타입 시스템에서는 이 둘이 거의 같은 코드로 처리됩니다.

이 Unsize 내장 구현은 가장 복잡하며, 특히 연관 타입의 복잡성을 지원하기 위해 재작업된 이후로 더욱 그렇습니다.

구체적으로, 업캐스팅 알고리즘은 다음 과정을 포함합니다. 소스 dyn 트레이트의 주 트레이트(principal)의 각 슈퍼트레이트(자기 자신 포함)에 대해…

  1. 슈퍼트레이트 참조를 대상의 주 트레이트와 통합합니다(항상 진짜 슈퍼트레이트로만 업캐스팅하고, 절대 impl을 통해 업캐스팅하지 않도록 보장합니다).
  2. 대상의 모든 자동 트레이트에 대해 해당 트레이트가 원본에 존재하는지 확인합니다(이를 통해 자동 트레이트를 제거할 수는 있지만 새로 얻을 수는 없습니다).
  3. 대상의 모든 프로젝션에 대해 원본의 단일 프로젝션과 단일화되는지 확인합니다(trait Sub: Sup<.., A = i32> + Sup<.., A = u32>가 주어진 경우 둘 이상이 있을 수 있기 때문입니다).

구체적으로 (3.)은 프로젝션 바운드의 선택이 불필요하게 추론을 유도하지 않도록 막습니다. 다만 선택이 모호하지 않을 때는 추론을 유도할 수 있습니다.


  1. 이전에는 “객체 안전(object safe)“이라고 불렸습니다. ↩

  2. 주 트레이트(principal)는 dyn Trait의 유일한 비자동 트레이트입니다. ↩