首页 文章

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

提问于
浏览
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() {}

Play link

这里的意图是使用相关类型使 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 回答

  • 3

    这里的目的是使用相关类型来使FooStore特征不需要针对DB的impl <F:Fooer,T:FooStore <F >> FooStore <F>的笨拙且有问题的语法,因为它经常抱怨F未被使用 .

    你的struct DB 需要分配一个实现 FooerFooStore::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 类型的对象 .

相关问题