Код с использованием std::iter::IntoIterator не работает

#rust #iterator

#Ржавчина #итератор

Вопрос:

Почему следующий код Rust не компилируется?

 let yy: dyn std::iter::IntoIterator<Item = i32, IntoIter = std::vec::IntoIter<i32>> =
    std::vec::Vec::new();
  
 error[E0308]: mismatched types
  --> src/main.rs:30:9
   |
29 |     let yy: dyn std::iter::IntoIterator<Item = i32, IntoIter = std::vec::IntoIter<i32>> =
   |             --------------------------------------------------------------------------- expected due to this
30 |         std::vec::Vec::new();
   |         ^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn std::iter::IntoIterator`, found struct `std::vec::Vec`
   |
   = note: expected trait object `dyn std::iter::IntoIterator<IntoIter = std::vec::IntoIter<i32>, Item = i32>`
                    found struct `std::vec::Vec<_>`
  

Соответственно, насколько я понимаю, это должно скомпилироваться, потому что есть:

 impl<T> IntoIterator for Vec<T>
  

Комментарии:

1. Чтобы создать объект trait, вам нужно было бы использовать Box как в этих примерах .

Ответ №1:

В начале этой страницы вы можете прочитать:

Эта структура создается методом into_iter в Vec

Я не знаю точно, чего вы хотите, но это может быть принято компилятором.

     let yy: amp;dyn std::iter::IntoIterator<
        Item = i32,
        IntoIter = std::vec::IntoIter<i32>,
    > = amp;std::vec::Vec::new().into_iter();