首页 文章

实现嵌套特征

提问于
浏览
9

我有一些特征(删除函数和一些参数膨胀后)看起来像:

trait Foo { }
trait Boo { }
trait Bar<T: Foo> { }
trait Baz { }

如果 U 实现了 Bar<T> ,某些 T 实现 FooU 实现 Boo ,则可以为 U 派生 Baz 的实现 . 但是,我无法编写有效的Rust代码 .

几次尝试是:

impl<T: Foo, U: Bar<T> + Boo> Baz for U { }

这使

error:类型参数T不受impl trait,self type或谓词约束[E0207]

impl<U: Bar<T> + Boo> Baz for U { }

产量

错误:类型名称T未定义或未在范围内[E0412]

一个/怎么可能在(稳定)Rust(希望没有任何动态调度)中做到这一点?

Edit :有些人暗示了一些类似的问题,基本上有两种方法(我发现它们都不适合我的情况):

  • 使用关联类型 . 我不想这样做,因为我想跟踪 T ,例如我想写一些像 fn bla<T: Foo, U: Bar<T>, V: Bar<T>>() 这样的签名的函数,我想知道 UVT 实现 Bar<T> . (或者有关联类型的方法吗?)

  • 通过将 UT 放在结构中来使用某种包装 . 我也不想使用它,因为我有几个级别的"trait dependencies",所以在每个级别包装东西会使代码膨胀很多 .

所以更新的问题是:没有使用关联的类型或包装器,是否有解决此问题的方法?

1 回答

  • 7

    你可以这样做 T 一个相关的类型:

    trait Foo { }
    trait Boo { }
    trait Bar {
        type T: Foo;
    }
    trait Baz { }
    
    impl<U: Bar + Boo> Baz for U
        // this where clause is not necessary (this bound is already true)
        // where U::T: Foo
    { }
    

    我不想这样做,因为我想跟踪T,例如我想写一些函数,它们有一个像fn bla <T:Foo,U:Bar <T>,V:Bar <T >>()的签名,我想知道U和V实现了Bar <T>相同的T.(或者有关联类型的方法吗?)

    是的,您可以使用相关类型执行此操作:

    fn bla<U: Bar, V: Bar<T = U::T>>() { }
    

相关问题