Overview
En esta guía, puedes aprender sobre los límites y cómo resolver un error común de límites.
¿Qué son los límites?
Los límites de los traits permiten que los métodos restrinjan los tipos que aceptan como parámetros y la funcionalidad que esos tipos deben implementar. Por ejemplo, si defines un método que acepta un parámetro de tipo genérico e imprime su valor, el parámetro debe implementar el Display rasgo para fines impresos. El siguiente ejemplo define el método printer() y especifica que su parámetro debe implementar Display:
fn printer<T: Display>(t: T) { println!("{}", t); }
Error común de límites
Al llamar a un método en un tipo de dato, puede que encuentres un error que indique que los límites del rasgo del método no se cumplen. Por ejemplo, el controlador puede generar el siguiente mensaje de error cuando se llama al método try_next() en una instancia Cursor:
error[E0599]: the method `try_next` exists for struct `mongodb::Cursor<T>`, but its trait bounds were not satisfied
El tipo Cursor<T> solo implementa la cualidad Stream, que se requiere para acceder al método try_next(), si se cumplen las restricciones de la cualidad para T. Es decir, T debe implementar el rasgo DeserializeOwned, como se especifica en el Cursor Documentación de la API. El siguiente ejemplo reproduce el mensaje de error anterior definiendo una estructura personalizada Actor que modela los documentos en la colección actors. Sin embargo, esta estructura no implementa el DeserializeOwned trait y la iteración sobre Actor usando el método try_next() causa un error:
// 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); };
Para resolver el error de límites de tipos, identifica el tipo de datos sobre el que el cursor itera y asegúrate de que este tipo de datos implementa la característica DeserializeOwned. Puedes usar el atributo derive para aplicar el límite de rasgos requerido.
Nota
Rasgos Deserialize y DeserializeOwned
La caja serde proporciona macros de derivación para generar la implementación de ciertos rasgos, incluido el rasgo Deserialize. Sin embargo, esta caja no ofrece un macro de derivación para el rasgo DeserializeOwned. Los tipos de datos que implementan Deserialize sin restricciones de vida útil implementan automáticamente DeserializeOwned, por lo que puedes implementar Deserialize para cumplir con la restricción de rasgo DeserializeOwned.
El siguiente ejemplo ajusta la definición de la estructura Actor para implementar Deserialize:
struct Actor { name: String, }
Recursos adicionales
Para obtener más información sobre los límites de rasgos, consulte los siguientes recursos: