簡體   English   中英

如何迭代結構集合作為特征對象引用的迭代器?

[英]How to iterate over a collection of structs as an iterator of trait object references?

我有一個struct對象的集合。 我想用特征對象的迭代器迭代集合,但是我不能為它創建一個合適的迭代器。 我減少的測試代碼是:

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM