Rust:特征中的类型引用

Rust: type reference within trait

我想实现我自己的通用容器,这是我正在使用的特征的片段:

pub trait MyVec
where
    Self: Default + Clone + IntoIterator,
    Self: std::iter::FromIterator<<Self as IntoIterator>::Item>,
{
    fn get(self: &Self, index: usize) -> <Self as IntoIterator>::Item;

    // many other methods are omitted.
}

是否可以引入一个新的计算类型变量,这样我就可以避免在任何地方输入 <Self as IntoIterator>::Item?一个简单的 type Item = <Self as IntoIterator>::Item 不起作用,因为它是一个可能被覆盖的关联类型。将类型参数用作 MyVec<I> 也不起作用,因为我不想为同一结构使用不同的 I 类型来实现此特征,并且在以后编写通用代码时也会导致问题。有什么建议吗?

我不认为您可以在 trait 中定义一个 type 作为实现者然后可以自定义此类型。

但是你可以在特征之外引入一个类型别名:

pub type IntoIterItem<T> = <T as IntoIterator>::Item;

pub trait MyVec : 
    Default
    + Clone
    + IntoIterator
    + std::iter::FromIterator<IntoIterItem<Self>>
{
    fn get(self: &Self, index: usize) -> IntoIterItem<Self>;
}

或者,作为黑客,您可以尝试 MyVec<I>,但使用默认值 I

pub trait MyVec<Item=<Self as IntoIterator>::Item> : 
    Default
    + Clone
    + IntoIterator
    + std::iter::FromIterator<Item>
{
    fn get(self: &Self, index: usize) -> Item;
}