小编flo*_*ero的帖子

如何对关联类型的关联类型施加类型约束(例如 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
}
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)

traits type-constraints rust associated-types

6
推荐指数
1
解决办法
2505
查看次数

为什么作为引用的迭代器项不转换为特征对象引用?

我正在尝试定义一个应该接收迭代器的函数,其中每个项目都是对特征对象的引用。例如:

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 …

casting reference traits rust

3
推荐指数
1
解决办法
1080
查看次数