Generics 如何使用嵌入的泛型成员创建结构?

Generics 如何使用嵌入的泛型成员创建结构?,generics,rust,Generics,Rust,我想在较大的结构中嵌入数据库结构,以便在代码中的不同位置使用: 我天真的做法是: extern crate leveldb; use leveldb::database::Database; pub struct Model { db: Database, } 但这会导致预期的一种类型参数错误,因此我尝试按照编译器告诉我的方法进行操作并得出结论,但仍然失败: extern crate leveldb; extern crate db_key; use leveldb::database

我想在较大的结构中嵌入
数据库
结构,以便在代码中的不同位置使用:

我天真的做法是:

extern crate leveldb;
use leveldb::database::Database;

pub struct Model {
  db: Database,
}
但这会导致
预期的一种类型参数错误,因此我尝试按照编译器告诉我的方法进行操作并得出结论,但仍然失败:

extern crate leveldb;
extern crate db_key;

use leveldb::database::Database;
use db_key::Key;

pub struct Model<K>
{
    db: Database<K>,
}

但现在Rust抱怨
预期的类型参数D,发现struct model::leveldb::database::database
。我原以为它会发现
D
绑定到
数据库
,但事实似乎并非如此。

我已经阅读了答案,但我无法理解的是
数据库
附带了另一个通用参数(
K
),需要以某种方式进行绑定。我不知道如何为此编写一个合理的where子句。我尝试过类似于
pub fn open(path:String)->Model where K:db_key::key{…}
where
Model
使用
K
,但Rust希望我添加一个生存期。这似乎很奇怪。我似乎可以这样声明db字段:
db:Database
,但我怎么知道呢?数据库要求它的K实现键特征,如果你看键是为i32实现的,为什么?我完全不知道我对leveldb一无所知。Rust不是一种类似javascript(随机语言选择)的语言,在这种语言中,您可以从做一些数据库工作开始,并期望了解一切。特别是学习生锈的诅咒是不友好的,你可以先读这本书,但要知道生锈需要大量的学习时间。
pub struct Model<D> {
    db: D,
}

impl<D> Model<D> where D: {
    pub fn open(path: String) -> Model<D> {
        let path = Path::new("/tmp/test");
        let mut options = Options::new();
        options.create_if_missing = true;
        let database = match Database::open(path, options) {
            Ok(db) => { db },
            Err(e) => { panic!("failed to open database: {:?}", e) }
        };

        Model {
            db: database,
        }
    }
}