Visão geral
Neste guia, você pode aprender sobre limites e como resolver um erro comum de limites.
O que são 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); }
Erro de limites comuns
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:
struct Actor { name: String, }
Recursos adicionais
Para obter mais informações sobre limites de características, consulte os seguintes recursos: