개요
이 가이드 에서는 바운드에 대해 학습 일반적인 바운드 오류를 해결하는 방법을 배울 수 있습니다.
바운드란 무엇인가요?
특성 경계를 사용하면 메서드에서 매개 변수로 허용하는 유형과 해당 유형이 구현 해야 하는 기능을 제한할 수 있습니다. 예시 를 들어 일반 유형 매개변수를 허용하고 해당 값을 출력하는 메서드를 정의하는 경우 매개변수는 출력을 위해 Display 트레이트를 구현 해야 합니다. 다음 예시 printer() 메서드를 정의하고 해당 매개변수가 Display을 구현 하도록 지정합니다.
fn printer<T: Display>(t: T) { println!("{}", t); }
공통 경계 오류
데이터 유형으로 메서드를 호출할 때 해당 메서드의 특성 경계가 충족되지 않는다는 오류가 발생할 수 있습니다. 예를 들어, Cursor 인스턴스에서 try_next() 메서드를 호출하면 드라이버에서 다음과 같은 오류 메시지가 표시될 수 있습니다.
error[E0599]: the method `try_next` exists for struct `mongodb::Cursor<T>`, but its trait bounds were not satisfied
유형은 의 특성 경계가 충족되는 Cursor<T> 경우 Stream try_next() T T DeserializeOwned 메서드에 액세스 데 필요한 특성만 구현합니다. 즉, 는 커서 API 문서에 지정된 대로 특성을 구현 해야 합니다. 다음 예시 컬렉션 의 Actor 문서를 모델링하는 사용자 지정 구조체를 정의하여 앞의 오류 메시지를 actors 재현합니다. 그러나 이 구조체는 DeserializeOwned 특성을 구현 하지 않으며 메서드를 Actor 사용하여 를 try_next() 반복하면 오류가 발생합니다.
// This code example produces a trait bounds error because // the Actor struct does not implement the DeserializeOwned trait. struct Actor { name: String, } // Add setup code here let my_coll: Collection<Actor> = client.database("db").collection("actors"); let mut cursor = my_coll.find(doc! {}).await?; while let Some(result) = cursor.try_next().await? { println!("{:?}", result); };
특성 경계 오류를 해결하려면 커서가 반복되는 데이터 유형을 식별하고 이 데이터 유형이 DeserializeOwned 특성을 구현하는지 확인하십시오. derive 속성을 사용하여 필요한 트레이트 바운드를 적용할 수 있습니다.
참고
소유 트레이트 역직렬화 및 역직렬화
serde 크레이트는 Deserialize 트레이트를 포함한 특정 트레이트의 구현을 생성하는 파생 매크로를 제공합니다. 그러나 이 크레이트는 DeserializeOwned 트레이트에 대한 파생 매크로를 제공하지 않습니다. 수명 제한 없이 Deserialize 을 구현하는 데이터 유형은 자동으로 DeserializeOwned 을 구현하므로 Deserialize 를 구현하여 DeserializeOwned 특성 경계를 충족할 수 있습니다.
다음 예에서는 Actor 구조체 정의를 조정하여 Deserialize 을 구현합니다.
struct Actor { name: String, }
추가 리소스
특성 경계에 대한 자세한 내용은 다음 리소스를 참조하세요.