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

Limites e erros de limites

Neste guia, você pode aprender sobre limites e como resolver um erro comum de limites.

Os limites de características permitem que os métodos restrinjam quais tipos eles aceitam como parâmetros e qual funcionalidade esses tipos devem implementar. Por exemplo, se você definir um método que aceita um parâmetro de tipo genérico e imprime seu valor, o parâmetro deverá implementar o traço Display para fins de impressão. O exemplo a seguir define o método printer() e especifica que seu parâmetro deve implementar Display:

fn printer<T: Display>(t: T) {
println!("{}", t);
}

Ao chamar um método em um tipo de dados, você pode encontrar um erro informando que os limites da propriedade do método não estão satisfeitos. Por exemplo, o driver pode gerar a seguinte mensagem de erro quando você chama o método try_next() em uma instância Cursor :

error[E0599]: the method `try_next` exists for struct `mongodb::Cursor<T>`,
but its trait bounds were not satisfied

O Cursor<T> tipo só implementa o Stream traço, que é necessário para acessar o try_next() método, se os limites do traço para T estiverem satisfeitos. Ou seja, T deve implementar a DeserializeOwned funcionalidade, conforme especificado na documentação da API do cursor. O exemplo a seguir reproduz a mensagem de erro anterior definindo uma estrutura personalizada Actor que modela documentos na actors coleção. No entanto, essa estrutura não implementa a traça,DeserializeOwned e a iteração sobre Actor usando o try_next() método causa um erro:

// 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 o erro de limites de transação, identifique o tipo de dados sobre o qual o cursor itera e certifique-se de que esse tipo de dados implemente a DeserializeOwned . Você pode utilizar o atributo derive para aplicar o limite de traço exigido.

Observação

Deserializar e desserializar características próprias

A caixa serde fornece macros derivadas para gerar a implementação de determinadas características, incluindo a Deserialize . No entanto, esta caixa não oferece uma macro de derivação para a DeserializeOwned . Os tipos de dados que implementam Deserialize sem restrições de vida útil implementam automaticamente DeserializeOwned, portanto, você pode implementar Deserialize para preencher o limite de características DeserializeOwned .

O exemplo a seguir ajusta a definição de estrutura Actor para implementar Deserialize:

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

Para obter mais informações sobre limites de características, consulte os seguintes recursos:

  • Limites na documentação da linguagem Rust

  • Derivar na documentação da linguagem Rust

Voltar

Séries temporais

Nesta página