我正在尝试定义具有关联类型的特征。我还希望关联类型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
}
Run Code Online (Sandbox Code Playgroud)
这个丑陋的where条款让我觉得应该有更好的方法。
这无法编译,因为这Item: AsRef<str>是非法构造:
trait Note {
type FieldsIter: Iterator<Item: AsRef<str>>;
//other fields and methods omitted
}
Run Code Online (Sandbox Code Playgroud)
这会失败,因为impl这里不允许:
trait Note {
type FieldsIter: Iterator<Item = impl AsRef<str>>;
//other fields and methods omitted
}
Run Code Online (Sandbox Code Playgroud)
这无法编译,因为我想Iterator::Item实现某个特征,而不是成为具体类型。
trait Note {
type FieldsIter: Iterator<Item = AsRef<str>>;
//other …Run Code Online (Sandbox Code Playgroud) 我正在尝试定义一个应该接收迭代器的函数,其中每个项目都是对特征对象的引用。例如:
use std::fmt::Display;
fn show_items<'a>(items: impl Iterator<Item = &'a Display>) {
items.for_each(|item| println!("{}", item));
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在迭代器上调用它时,其中每个项目都是对实现的类型的引用Display:
let items: Vec<u32> = (1..10).into_iter().collect();
show_items(items.iter());
Run Code Online (Sandbox Code Playgroud)
我收到错误:
error[E0271]: type mismatch resolving `<std::slice::Iter<'_, u32> as std::iter::Iterator>::Item == &dyn std::fmt::Display`
--> src/lib.rs:9:5
|
9 | show_items(items.iter());
| ^^^^^^^^^^ expected u32, found trait std::fmt::Display
|
= note: expected type `&u32`
found type `&dyn std::fmt::Display`
note: required by `show_items`
--> src/lib.rs:3:1
|
3 | fn show_items<'a>(items: impl Iterator<Item = &'a Display>) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)
为什么&u32 …