首页 > 解决方案 > Rust:特征中的类型引用

问题描述

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

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不起作用,因为它是可能被覆盖的关联类型。使用类型参数 asMyVec<I>也不起作用,因为我不想I为同一个结构用不同类型实现这个特征,并且在以后编写通用代码时也会导致问题。有什么建议吗?

标签: rusttraitstype-parameter

解决方案


我认为您不能typetraitas 实现者中定义 a 然后可以自定义此类型。

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

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>;
}

或者,作为 hack,您可以尝试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;
}

推荐阅读