gpt4 book ai didi

iterator - 如何迭代结构集合作为特征对象引用的迭代器?

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

我有一组结构对象。我想用特征对象的迭代器迭代集合,但我无法为此创建合适的迭代器。我简化的测试代码是:

struct MyStruct {}
struct MyStorage(Vec<MyStruct>);

trait MyTrait {} // Dummy trait to demonstrate the problem
impl MyTrait for MyStruct {}

trait MyContainer {
fn items<'a>(&'a self) -> Box<Iterator<Item = &'a MyTrait> + 'a>;
}
impl MyContainer for MyStorage {
fn items<'a>(&'a self) -> Box<Iterator<Item = &'a MyTrait> + 'a> {
Box::new(self.0.iter())
}
}

这会导致以下编译器错误:

error[E0271]: type mismatch resolving `<std::slice::Iter<'_, MyStruct> as std::iter::Iterator>::Item == &MyTrait`
--> src/main.rs:12:9
|
12 | Box::new(self.0.iter())
| ^^^^^^^^^^^^^^^^^^^^^^^ expected struct `MyStruct`, found trait MyTrait
|
= note: expected type `&MyStruct`
found type `&MyTrait`
= note: required for the cast to the object type `std::iter::Iterator<Item=&MyTrait>`

我的理解是虽然&MyStruct通常可转换为 &MyTrait , Iterator在这种情况下,标准库的实现不允许这样做。请注意,相同的构造适用于 Vec<Box<MyStruct>>Iterator<Item=&Box<MyTrait>> ,但在这里感觉没有必要装箱。

有什么方法可以使它与引用一起工作吗?

最佳答案

您需要显式地转换单个元素,如下所示:

Box::new(self.0.iter().map(|e| e as &MyTrait))

关于iterator - 如何迭代结构集合作为特征对象引用的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47156009/

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