使用采用通用参数的方法的特征

时间:2015-08-24 19:41:43

标签: rust

我正在Rust中构建一个webapp,并尝试实现基本的Rails风格的数据库迁移来管理我的数据库。在我的代码中,Migration是一种特性,具有应用和回滚迁移的上下方法。每个单独的数据库迁移都是实现迁移特征的结构。

我从这个版本的Migration trait开始,它编译得很好:

pub trait Migration : Display {
    fn up(&self, connection: &postgres::Connection) -> postgres::Result<()>;
    fn down(&self, connection: &postgres::Connection) -> postgres::Result<()>;
}

但理想情况下,我希望允许调用者传入事务对象或原始连接对象来运行迁移。 Postgres crate通过提供连接和事务实现的GenericConnection特征来支持这一点。所以我重构了我的迁移特性:

pub trait Migration : Display {
    fn up<T: postgres::GenericConnection>(&self, connection: &T) -> postgres::Result<()>;
    fn down<T: postgres::GenericConnection>(&self, connection: &T) -> postgres::Result<()>;
}

但是现在编译时,任何试图使用Migration的代码都会生成错误the trait db::migrations::migration::Migration is not implemented for the type db::migrations::migration::Migration。例如,我有一个跟踪我所有迁移的结构:

pub struct MigrationIndex {
    /// all database migrations, in order from first to last
    migrations: Vec<Box<Migration>>
}

它与Migration特征的第一个版本编译良好,并且在使用带有泛型的Migration版本时失败并出现上述错误。我在特征错误中使用泛型吗?

0 个答案:

没有答案