我无法了解相关类型。我的问题代码:
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;
?或者我是以某种方式使用这个错误的?
注意:我在构建这个示例时遇到了一些问题,我现在正试图纠正这个问题。我遇到的错误是:
cargo: the trait `Fooer` cannot be made into an object [E0038]
答案 0 :(得分:3)
此处的目的是使用关联类型使
FooStore
特征不需要impl<F:Fooer, T: FooStore<F>> FooStore<F> for DB
的笨拙且有问题的语法,因为这通常会抱怨F
未被使用。
您的结构DB
需要将实现Fooer
的具体类型分配给FooStore::T
。 Fooer
是一个特征,但也可以用作未分类的类型。但是,您无法在此处使用未归类的类型,因为您无法按值传递未归类类型的参数(FooStore::store_foo
需要)。
如果您不希望DB
将特定类型分配给FooStore::T
,那么您可以DB
通用。
use std::marker::PhantomData;
#[allow(dead_code)]
struct DB<F: Fooer> {
_phantom: PhantomData<F>,
}
impl<F: Fooer> FooStore for DB<F> {
type T = F;
fn store_foo(&self, _fooer: Self::T) {}
}
请注意PhantomData
的使用:我们使用它来强制使用参数T
,它还表明DB<T>
在概念上拥有T
类型的对象。