Структура с чертой в штучной упаковке - PullRequest
1 голос
/ 16 апреля 2020

Я не могу понять, почему это не скомпилируется. Я просто хочу иметь структуру с итератором, где итератор создается с функцией, которая возвращает impl Trait. Я изменил свой код на минимальный пример для этого поста.

Открыть в Rust Playground

struct Foo {
    pub it: Option<Box<dyn Iterator<Item=i32>>>,
}

impl Foo {
    fn new() -> Self {
        let it = Some(Box::new(my_numbers()));
        Self { it: it }
    }
}

fn my_numbers() -> impl Iterator<Item=i32> {
    1..10
}

Вывод компилятора:

   |
8  |         Self { it: it }
   |                    ^^ expected trait object `dyn std::iter::Iterator`, found opaque type
...
12 | fn my_numbers() -> impl Iterator<Item=i32> {
   |                    ----------------------- the found opaque type
   |
   = note: expected enum `std::option::Option<std::boxed::Box<(dyn std::iter::Iterator<Item = i32> + 'static)>>`
              found enum `std::option::Option<std::boxed::Box<impl std::iter::Iterator>>`

Редактировать:

Я обнаружил, что один обходной путь использует #![feature(type_alias_impl_trait)], но это не стабильно.

1 Ответ

1 голос
/ 17 апреля 2020

Приведение в штучной упаковке значения, то есть Box::new(my_numbers()) as Box<dyn Iterator<Item=_>> решает это со стабильным Rust 1.41.0. Возможно, что включение type_alias_impl_trait поможет с этим аспектом вывода пропущенного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...