我在学习相关类型时遇到了麻烦 . 我的问题代码:
trait Fooer {
fn foo(&self);
}
trait FooStore {
type T: Fooer;
fn store_foo(&self, fooer: Self::T);
}
#[allow(dead_code)]
struct DB {}
impl FooStore for DB {
type T = Fooer;
fn store_foo(&self, _fooer: Self::T) {}
}
fn main() {}
这里的意图是使用相关类型使 FooStore
特征不需要 impl<F:Fooer, T: FooStore<F>> FooStore<F> for DB
的笨拙和有问题的语法,因为这经常抱怨没有使用 F
.
但是,此功能上的official docs显示实现基础关联类型的对象 - 但不是特征 . 在此示例中, DB
不知道哪些结构可能会传递到 store_foo(..)
,因此需要使用特征来解决此问题 .
话虽如此,如何在 impl
期间获取关联类型以使用特征?也就是说,我怎么能写 type T = Fooer;
?或者我以某种方式使用这个错误?
Note :我现在试图纠正这个问题 . 我遇到的错误是:
cargo: the trait `Fooer` cannot be made into an object [E0038]
1 回答
你的struct
DB
需要分配一个实现Fooer
到FooStore::T
的具体类型 .Fooer
是一个特征,但也可以用作未大小的类型 . 但是,您可以按值传递未归类类型的参数(FooStore::store_foo
要求) .如果您不希望
DB
将特定类型分配给FooStore::T
,则可以使DB
泛型 .注意使用
PhantomData
:我们用它来强制使用参数T
,它还表明DB<T>
在概念上拥有T
类型的对象 .