Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Límites y errores de límites

En esta guía, aprenderá sobre los límites y cómo resolver un error común relacionado con ellos.

Los límites de rasgos permiten a los métodos restringir qué tipos aceptan como parámetros y qué funcionalidad deben implementar esos tipos. Por ejemplo, si define un método que acepta un parámetro de tipo genérico e imprime su valor, el parámetro debe implementar la Display rasgo para fines de impresión. 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);
}

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 el rasgo Stream, que es necesario para acceder al método try_next(), si se cumplen los límites del rasgo para T. Es decir, T debe implementar el rasgo DeserializeOwned, como se especifica en el CursorDocumentación de la API. El siguiente ejemplo reproduce el mensaje de error anterior definiendo una estructura personalizada Actor que modela documentos en la actors colección. Sin embargo, esta estructura no implementa el DeserializeOwned rasgo y la iteración sobre Actor mediante el try_next() método provoca 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 rasgo, identifique el tipo de dato sobre el que itera el cursor y asegúrese de que este tipo de dato implemente el rasgo DeserializeOwned. Puede usar el atributo derive para aplicar el límite de rasgo 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:

#[derive(Deserialize)]
struct Actor {
name: String,
}

Para obtener más información sobre los límites de rasgos, consulte los siguientes recursos:

  • Límites en la documentación del lenguaje Rust

  • Derive en la documentación del lenguaje Rust

Volver

Time Series

En esta página