Rust 如何对关联类型(例如迭代器::项)的关联类型施加类型约束?

Rust 如何对关联类型(例如迭代器::项)的关联类型施加类型约束?,rust,traits,type-constraints,associated-types,Rust,Traits,Type Constraints,Associated Types,我正在尝试定义一个与类型相关的特征。我还希望关联类型实现迭代器及其项关联类型实现AsRef 虽然我知道如何为函数或具体的迭代器::Item类型执行此操作,但我无法为原始情况提供清晰简洁的解决方案 感谢这些有用的错误消息,我的编译解决方案是: trait Note where <<Self as Note>::FieldsIter as Iterator>::Item: AsRef<str>, { type FieldsIter: Iterato

我正在尝试定义一个与类型相关的特征。我还希望关联类型实现
迭代器
及其
关联类型实现
AsRef

虽然我知道如何为函数或具体的
迭代器::Item
类型执行此操作,但我无法为原始情况提供清晰简洁的解决方案

感谢这些有用的错误消息,我的编译解决方案是:

trait Note
where
    <<Self as Note>::FieldsIter as Iterator>::Item: AsRef<str>,
{
    type FieldsIter: Iterator;
    //other fields and methods omitted
}
此操作失败,因为此处不允许使用
impl

trait Note {
    type FieldsIter: Iterator<Item = impl AsRef<str>>;
    //other fields and methods omitted
}

您可以做一个小小的改进,但除此之外,当前的语法如下所示:

trait Note
where
    <Self::FieldsIter as Iterator>::Item: AsRef<str>,
{
    type FieldsIter: Iterator;
}
现在解决这个问题的一种方法类似于。这将引入另一个关联类型:

trait Note {
    type FieldsIter: Iterator<Item = Self::Item>;
    type Item: AsRef<str>;
}
trait注释{
类型FieldsIter:Iterator;
类型项:AsRef;
}
我不喜欢这个,因为它引入的类型起初看起来是相互正交的,但最终是紧密相关的

trait Note
where
    <Self::FieldsIter as Iterator>::Item: AsRef<str>,
{
    type FieldsIter: Iterator;
}
trait Note {
    type FieldsIter: Iterator<Item: AsRef<str>>;
}
trait Note {
    type FieldsIter: Iterator<Item = Self::Item>;
    type Item: AsRef<str>;
}