Rust: тип ссылки внутри черты - PullRequest
0 голосов
/ 22 апреля 2020

Я хотел бы реализовать свой собственный контейнер generi c, и это фрагмент черты, которую я использую:

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 для одной и той же структуры, и это также вызывает проблемы при написании кода generi c позже. Любые рекомендации?

1 Ответ

0 голосов
/ 22 апреля 2020

Я не думаю, что вы можете определить type в trait, поскольку разработчики могли бы настроить этот тип.

Но вы могли бы ввести псевдоним типа вне черты:

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