特征上的关联类型默认值

Unb*_*T26 6 types traits rust

当我们需要一个依赖于特征中其他类型的类型时,我们如何克服关联类型默认值的问题?

    trait Foo{
        type C;
        type K = Vec<Self::C>;
    }
Run Code Online (Sandbox Code Playgroud)
error[E0658]: associated type defaults are unstable
  |
3 |     type K = Vec<Self::C>;
  |     ^^^^^^^^^^^^^^^^^^^^^^
  |
   = note: see issue #29661 <https://github.com/rust-lang/rust/issues/29661> for more information
Run Code Online (Sandbox Code Playgroud)

kmd*_*eko 8

它依赖于另一个关联类型这一事实是无关紧要的。为关联类型提供默认值还不是一项受支持的功能。

trait Foo {
    type K = i32;
}
Run Code Online (Sandbox Code Playgroud)
trait Foo {
    type K = i32;
}
Run Code Online (Sandbox Code Playgroud)

如果您想使用当前(不稳定)的实现,您可以使用 nightly 进行编译并启用该associated_type_defaults功能,这确实适合您的情况:

#![feature(associated_type_defaults)]

trait Foo {
    type C;
    type K = Vec<Self::C>;
}
Run Code Online (Sandbox Code Playgroud)

我不确定我是否会推荐它,尽管仅基于跟踪问题表明的内容不完整,但这取决于您。


综上所述,这不应该是一个“问题”。当然,提供默认值可能会很方便,但这不是必需的。只需在实现特征时指定它即可:

trait Foo {
    type C;
    type K;
}

impl Foo for i32 {
    type C = i32;
    type K = Vec<Self::C>;
}
Run Code Online (Sandbox Code Playgroud)