Here is a version of your code that runs on the playground:
pub trait Entity {
fn map(&self, Result<QueryResult>) -> Self;
}
pub struct DbQuery<T> {
pub sql: String,
pub params: Vec<Value>,
pub limit: i32,
pub paged: Option<Pagination>,
pub entity: T,
}
pub struct Settings {
pub name: String,
pub value: Option<String>,
}
impl Entity for Settings {
fn map(&self, result: Result<QueryResult>) -> Settings {
// ...
Settings {
name: "hello".to_string(),
value: None,
}
}
}
impl DbMapper {
// ...
pub fn find<T>(&self, query: DbQuery<T>) -> Option<Vec<T>> {
println!("query find SQL: {}", query.sql);
let mut stmt = &self.pool.prepare(query.sql).unwrap();
let ret = Vec::new();
for row in stmt.execute(query.params).unwrap() {
ret.push(query.entity.map(row.unwrap()));
}
Some(ret)
}
}
しかし、私はエラーを取得します問題を再現します:
pub struct QueryResult;
pub struct Value;
pub struct Pagination;
pub struct DbMapper;
pub trait Entity {
fn map(&self, Result<QueryResult,()>) -> Self;
}
pub struct DbQuery<T> {
pub sql: String,
pub params: Vec<Value>,
pub limit: i32,
pub paged: Option<Pagination>,
pub entity: T,
}
pub struct Settings {
pub name: String,
pub value: Option<String>,
}
impl Entity for Settings {
fn map(&self, result: Result<QueryResult,()>) -> Settings {
// ...
Settings {
name: "hello".to_string(),
value: None,
}
}
}
impl DbMapper {
// ...
pub fn find<T>(&self, query: DbQuery<T>) -> Option<Vec<T>> {
println!("query find SQL: {}", query.sql);
// ########## attempt to call map()
let _ = query.entity.map(Ok(QueryResult {}));
let ret = Vec::new();
Some(ret)
}
}
fn main() {}
問題はですfind
メソッドのDbQuery<T>
引数のは、T
がEntity
タイプであるという考えを持っていません。だから私たちはそれを伝える必要があります:
pub fn find<T>(&self, query: DbQuery<T>) -> Option<Vec<T>>
where T: Entity
{
// ... code here ...
}
This now compiles and runs
コンパイラは、T
が何らかの説明のEntity
であることを知り、その上でmap
メソッドを呼び出すことができます。
あなたの例は、最小の例としてはそれほど立派なものではありませんが、 'DbQuery'や' DbMapper ::/DbMapper :: 'に' Entity'を実装するために 'T'を制約していないと答えました。発見する。 –
申し訳ありませんが、私はそれを説明するために最小限のコードを使用しました。 残念ながら私は既にTの代わりにEntityを試しましたが、同じエラーが表示されます – plailopo
こんにちは - これはやや小さめですが、play.rust-lang.orgに入れてコンパイルして同じエラーが発生するほど十分ではありませんが、だから確かめるのはちょっと難しい。 –