我正在尝试将数字解码为整数,并获得仅此数字的迭代器,或者如果不是数字,则返回一个空的迭代器。我试图这样做:

let ch = '1';
ch.to_digit(10).map(once).unwrap_or(empty())

这不会编译。我收到以下错误消息:

error[E0308]: mismatched types
 --> src/lib.rs:6:41
  |
6 |     ch.to_digit(10).map(once).unwrap_or(empty());
  |                                         ^^^^^^^ expected struct `std::iter::Once`, found struct `std::iter::Empty`
error[E0308]: mismatched types
 --> src/lib.rs:6:41
  |
6 |     ch.to_digit(10).map(once).unwrap_or(empty());
  |                                         ^^^^^^^ expected struct `std::iter::Once`, found struct `std::iter::Empty`
  |
  |
  = note: expected type `std::iter::Once<u32>`
             found type `std::iter::Empty<_>`

  = note: expected type `std::iter::Once<u32>`
             found type `std::iter::Empty<_>`

我有什么办法告诉.unwrap_or(...)我不在乎实际的类型,只是我将获得Iterator的实现?

最佳答案

存在 IntoIterator 特性仅是为了能够将类型转换为迭代器:


Option实现IntoIterator:

impl<'a, T> IntoIterator for &'a mut Option<T>
impl<T> IntoIterator for Option<T>
impl<'a, T> IntoIterator for &'a Option<T>
Result也是如此。
您需要做的就是调用 into_iter (或在调用IntoIterator的地方使用该值,例如for循环):
fn x() -> impl Iterator<Item = u32> {
    let ch = '1';
    ch.to_digit(10).into_iter()
}
也可以看看:
  • Why does `Option` support `IntoIterator`?
  • Iterator on Option<Vec<>>
  • 10-06 10:08