Rust 特征中的等式约束。具有 Into<T> 特征的变体

Equality constraints in trait in Rust. Variant with Into<T> trait

我希望 ToKeyIter::Item 等于 ToKeyIter::KeyIter::Item,因为 KeyIter 应该实现 Iterator 特性。我做不到,因为 where 子句中有约束相等性。这就是为什么我决定使用 trait Into.

pub trait ToKeyIter {
    type Item: Clone + Hash + Eq;
    type KeyIter<'b>: Iterator where Self: 'b, <Self::KeyIter<'b> as Iterator>::Item: Into<Self::Item>;
    fn key_iter<'a> (&'a self) -> Self::KeyIter<'a> 
    where <Self::KeyIter<'a> as Iterator>::Item: Into<Self::Item>;
}

trait 本身可以编译,但是当我尝试为 str 或 String 实现它时,编译器失败并显示“溢出评估需求”。

impl ToKeyIter for str {
    type Item = char;
    type KeyIter<'a> = Chars<'a>;

    fn key_iter<'a> (&'a self) -> Chars<'a> {
        self.chars()
    }
}


impl ToKeyIter for String {
    type Item = char;
    type KeyIter<'a> = Chars<'a>;
    
    fn key_iter<'a> (&'a self) -> Chars<'a> {
        self.chars()
    }
} 

如果你能说出这样的东西怎么写

Key::Item == Key::KeyIter::Item

会很棒的。但我也想知道我应该怎么做才能正确实现具有 Into 特征的 str 和 String。

您可以指定Iterate<Item=Self::Item>来获得您想要的。请参阅 the playground 了解此内容的实时版本:

#![feature(generic_associated_types)]

use std::hash::Hash;
use std::str::Chars;

pub trait ToKeyIter {
    type Item: Clone + Hash + Eq;
    type KeyIter<'a>: Iterator<Item=Self::Item>
    where
        Self: 'a;
    fn key_iter<'a>(&'a self) -> Self::KeyIter<'a>;
}

impl ToKeyIter for str {
    type Item = char;
    type KeyIter<'a> = Chars<'a>;

    fn key_iter<'a> (&'a self) -> Chars<'a> {
        self.chars()
    }
}
impl ToKeyIter for String {
    type Item = char;
    type KeyIter<'a> = Chars<'a>;
    
    fn key_iter<'a> (&'a self) -> Chars<'a> {
        self.chars()
    }
}