Overview
このガイドでは、限界と一般的な限界エラーを解決する方法について学習できます。
限界とは
限界が設定されているため、メソッドはパラメーターとして受け入れる型と、それらの型に実装する必要がある機能を制限できます。例、ジェネリック型パラメーターを受け入れ、その値を出力するメソッドを定義する場合、そのパラメーターは出力目的で 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>Streamtry_next()TT型は、DeserializeOwned の特権の限界が満たされている場合にのみ、 メソッドにアクセスするために必要な 特権を実装します。つまり、 は、 カーソル APIドキュメントに指定されているように 特権を実装する必要があります。次の例では、Actor コレクション内のドキュメントをモデル化するカスタム 構造体を定義して、前述のエラーactors メッセージを複製します。ただし、この構造体には 特権が実装されていないため、DeserializeOwned メソッドを使用して を反復処理するとエラーが発生します。Actortry_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 crate は、 Deserialize特権を含む特定の特権の実装を生成するための派生マイクロを提供します。 ただし、この crate はDeserializeOwned特権の派生マイクロを提供しません。 有効期限の制限なしでDeserializeを実装するデータ型は自動的にDeserializeOwnedを実装するため、 Deserializeを実装してDeserializeOwnedの制約を満たすことができます。
次の例えではActorの構造体定義を調整してDeserializeを実装します。
struct Actor { name: String, }
追加リソース
特性の限界の詳細については、次のリソースを参照してください。