수색…


비고

  • AsRefBorrow 는 유사하지만 별개의 목적을 제공합니다. Borrow 은 여러 가지 차용 방법을 비슷하게 처리하거나 차용 된 값을 소유 한 것과 같이 취급하는 데 사용되는 반면 AsRef 는 참조를 제네릭 화하는 데 사용됩니다.
  • From<A> for B Into<B> for AInto<B> for A 의미하지만 그 반대는 아닙니다.
  • From<A> for AFrom<A> for A 는 암시 적으로 구현됩니다.

에서

Rust 's From trait은 유형 간 변환을위한 범용 특성입니다. TypeATypeB 두 가지 유형에 대해,

impl From<TypeA> for TypeB

의 예를 나타냅니다 TypeB 의 인스턴스에서 작도로 보장됩니다 TypeA . From 의 구현은 다음과 같습니다.

struct TypeA {
    a: u32,
}

struct TypeB {
    b: u32,
}

impl From<TypeA> for TypeB {
    fn from(src: TypeA) -> Self {
        TypeB {
            b: src.a,
        }
    }
}

AsRef & AsMut

std::convert::AsRefstd::convert::AsMut 는 형식을 참조로 저렴하게 변환하는 데 사용됩니다. 유형 A 및 유형 B ,

impl AsRef<B> for A

&A&B 로 변환 될 수 있음을 나타내며,

impl AsMut<B> for A

&mut A&mut B 로 변환 될 수 있음을 나타냅니다.

이것은 값을 복사하거나 이동하지 않고 형식 변환을 수행 할 때 유용합니다. 표준 라이브러리의 예제는 std::fs::File.open() .

fn open<P: AsRef<Path>>(path: P) -> Result<File>

이렇게하면 File.open() 에서 Path 뿐만 아니라 OsStr , OsString , str , StringPathBuf 도 암시 적 변환으로 받아 들일 수 있습니다. 이러한 유형은 모두 AsRef<Path> 구현하기 때문입니다.

Borrow, BorrowMut 및 ToOwned

std::borrow::Borrowstd::borrow::BorrowMut 특성은 소유 유형과 같은 빌린 유형을 처리하는 데 사용됩니다. 유형 A 및 유형 B ,

impl Borrow<B> for A

차용 된 AB 가 요구되는 곳에 사용될 수 있음을 나타낸다. 예를 들어 std::collections::HashMap.get()get() 메소드에 Borrow 를 사용하여 A 키가있는 HashMap&B 사용하여 색인을 생성 할 수 있습니다.


반면 std::borrow::ToOwned 는 역 관계를 구현합니다.

따라서 앞서 언급 한 유형 AB 하면 다음을 구현할 수 있습니다.

impl ToOwned for B

주 : A 는 여러 고유 한 유형 T 대해 Borrow<T> 를 구현할 수 있지만 BToOwned 한 번만 구현할 수 있습니다.

Deref & DerefMut

std::ops::Derefstd::ops::DerefMut 형질은 역 참조 연산자 인 *x 를 오버로딩하는 데 사용됩니다. 유형 A 및 유형 B ,

impl Deref<Target=B> for A

&A 의 바인딩을 역 참조하면 &B 가 생성되고,

impl DerefMut for A

&mut A 의 바인딩을 참조 해제하면 &mut B 가 생성됨을 나타냅니다.

Deref ( DerefMut )는 deref 강압 이라고하는 유용한 언어 기능을 제공하여 &A (resp. &mut A )가 자동으로 &B (resp. &mut B )를 강요 할 수있게합니다. 이것은 String 에서 &str 로 변환 할 때 일반적으로 사용됩니다. &String 은 필요에 따라 &str 암시 적으로 강제 변환됩니다.


주 : DerefMut 는 결과 유형 지정을 지원하지 않으며, Deref 와 동일한 유형을 사용합니다.

참고 : 관련 유형 ( AsRef 와 달리)을 사용하기 때문에 특정 유형은 DerefDerefMut 각각을 한 번만 구현할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow