gpt4 book ai didi

rust - 如何对关联类型的关联类型施加类型约束(例如 Iterator::Item)?

转载 作者:行者123 更新时间:2023-11-29 08:07:18 25 4
gpt4 key购买 nike

我正在尝试定义具有关联类型的特征。我还希望关联类型实现 Iterator及其 Item关联类型实现 AsRef<str> .

虽然我知道如何为函数或具体的 Iterator::Item 做这件事类型,我无法为原始案例想出一个清晰简洁的解决方案。

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

trait Note
where
<<Self as Note>::FieldsIter as Iterator>::Item: AsRef<str>,
{
type FieldsIter: Iterator;
//other fields and methods omitted
}

where条款让我觉得应该有更好的方法。

Item: AsRef<str> 后无法编译属于违法 build :

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

这失败了,因为 impl此处不允许:

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

这不会编译,因为我想要 Iterator::Item实现某种特征,而不是具体类型。

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

最佳答案

你可以做一个小的改进,但除此之外,当前的语法如你所发现的那样:

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

这是消除歧义的语法,唯一的问题是还没有办法制作歧义版本! Rust issue #38078开放以允许 Foo::Bar::Baz 语法。

RFC 2289也作为一种改进方式开放。实现 RFC 后,您的第二个示例应该可以工作:

trait Note {
type FieldsIter: Iterator<Item: AsRef<str>>;
}

您现在可以解决此问题的一种方法类似于 IntoIterator .这引入了另一种关联类型:

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

我不喜欢这个,因为它引入的类型起初看起来彼此正交,但最终却紧密相关。

关于rust - 如何对关联类型的关联类型施加类型约束(例如 Iterator::Item)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53998181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com