2

我在学习关联类型时遇到了麻烦。我的问题代码:

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没有被使用。

但是,有关此功能的官方文档显示了实现底层关联类型的对象 - 但不是特征。在这个例子中,DB不知道可能会传入什么结构体store_foo(..),所以它需要使用一个 trait 来解决这个问题。

话虽如此,我怎样才能让关联类型在 期间使用特征impl?也就是说,我该怎么写type T = Fooer;?还是我以某种方式使用了这个错误?

注意:我在构建这个例子时遇到了一些麻烦,我现在正在尝试纠正这个问题。我遇到的错误是:

cargo: the trait `Fooer` cannot be made into an object [E0038]
4

1 回答 1

3

这里的目的是使用关联类型来使FooStore特征不需要笨拙和有问题的语法,impl<F:Fooer, T: FooStore<F>> FooStore<F> for DB因为这经常抱怨F没有被使用。

您的结构DB需要分配一个具体的类型来Fooer实现FooStore::T. Fooer是一个特征,但也可以用作未调整大小的类型。但是,您不能在此处使用 unsized 类型,因为您不能按值传递 unsized 类型的参数(这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

于 2016-05-16T03:15:08.733 回答