实现具有相关特征类型的特征

时间:2016-05-16 02:58:51

标签: rust traits associated-types

我无法了解相关类型。我的问题代码:

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() {}

Play link

此处的目的是使用关联类型使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]

1 个答案:

答案 0 :(得分:3)

  

此处的目的是使用关联类型使FooStore特征不需要impl<F:Fooer, T: FooStore<F>> FooStore<F> for DB的笨拙且有问题的语法,因为这通常会抱怨F未被使用。

您的结构DB需要将实现Fooer的具体类型分配给FooStore::TFooer是一个特征,但也可以用作未分类的类型。但是,您无法在此处使用未归类的类型,因为您无法按值传递未归类类型的参数(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类型的对象。

相关问题