如何专门针对不同类型参数的特征实现?
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
}
}
我需要调用一些特定于类型参数的逻辑。我怎样才能做到这一点?
我试试下面的代码:
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
}
}