rust - 如何对关联类型的关联类型(例如 Iterator::Item)施加类型约束?
问题描述
我正在尝试定义具有关联类型的特征。我还希望关联类型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>
是非法构造:
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 问题 #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>;
}
我不喜欢这个,因为它引入了最初看起来相互正交但最终紧密相关的类型。
推荐阅读
- python - “views.py”在哪里
- java - 读取 API 和 GSON 类
- html - How can I hide the value from a input, so that the value is still accesable but won't be displayed?
- php - 来自数据库的 OpenCart 动态菜单
- mongodb - 建议我在 mongodb 中建立 2 个文档之间的关系
- python - 捕获时限制正向前瞻
- php - Laradock 单元测试数据库错误 PDOException
- keras - keras 损失是 nan 但准确度定义明确
- android - android中的phonegap启动画面是黑色的
- mysql - 查找具有 %latin1% 值的数据库的所有列