如何专门针对不同类型参数的特征实现?

How to specialise trait implementations for different type parameters?

我需要调用一些特定于类型参数的逻辑。我怎样才能做到这一点?

我试试下面的代码:

trait Conn {}

struct SqliteConn;
struct PostgreConn;

impl Conn for SqliteConn {}
impl Conn for PostgreConn {}

trait Data {
    fn init(&mut self);
}

struct Db<C: Conn> {
    conn: C,
}

impl<C: Conn> Db<C> {
    fn new(conn: C) -> Self {
        let mut db = Self { conn };
        db.init(); // fails here
        db
    }
}

impl Data for Db<SqliteConn> {
    fn init(&mut self) {
        // sqlite3-specific init
    }
}

impl Data for Db<PostgreConn> {
    fn init(&mut self) {
        // postgre-specific init
    }
}

Rust 编译器抱怨“在当前范围内没有为结构 Db 找到名为 init 的方法”错误。我该如何解决这个问题?

您需要要求 Db<C> 具有 Data 的实现,您可以使用 where:

impl <C: Conn> Db<C> where Db<C>: Data {
  fn new(conn: C) -> Self {
    let mut db = Self { conn };
    db.init();
    db
  }
}