簡體   English   中英

如何為枚舉中的單個或多個值返回迭代器

[英]How to return an iterator for single or multiple values in enum

考慮以下代碼:

struct MediaKind;
struct OtherFields;

enum Media {
    Single(MediaKind),
    Group(Vec<MediaKind>, OtherFields),
}

impl Media {
    fn iter(&self) -> impl Iterator<Item = &MediaKind> {
        match self {
            Self::Single(media) => [media].iter(),
            Self::Group(media_vec, _) => media_vec.iter(),
        }
    }
}

編譯錯誤:

error[E0308]: `match` arms have incompatible types
  --> src/lib.rs:13:42
   |
11 | /         match self {
12 | |             Self::Single(media) => [media].iter(),
   | |                                    -------------- this is found to be of type `std::slice::Iter<'_, &MediaKind>`
13 | |             Self::Group(media_vec, _) => media_vec.iter(),
   | |                                          ^^^^^^^^^^^^^^^^ expected `&MediaKind`, found struct `MediaKind`
14 | |         }
   | |_________- `match` arms have incompatible types
   |
   = note: expected struct `std::slice::Iter<'_, &MediaKind>`
              found struct `std::slice::Iter<'_, MediaKind>`

因為Group arm 可能包含其他字段,所以用Vec替換整個enum不是首選解決方案。

我已嘗試either以下方式解決問題:

fn iter(&self) -> impl Iterator<Item = &MediaKind> {
    use either::*;

    match self {
        Self::Single(media) => Left([media].into_iter()),
        Self::Group(media_vec, _) => Right(media_vec.iter()),
    }
}

但我想知道是否有可能在不依賴外部板條箱的情況下修復它。

> 游樂場鏈接

在這種情況下,因為一種情況是切片迭代器而另一種情況是一個元素,您可以使用一個技巧: std::slice::from_ref()

fn iter(&self) -> impl Iterator<Item = &MediaKind> {
    match self {
        Self::Single(media) => std::slice::from_ref(media).iter(),
        Self::Group(media_vec, _) => media_vec.iter(),
    }
}

游樂場

暫無
暫無

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

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