作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试定义具有关联类型的特征。我还希望关联类型实现 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/
我是一名优秀的程序员,十分优秀!