Я получаю ошибки типа при соединении разных типов итераторов.Цепочные итераторы разных типов
let s = Some(10);
let v = (1..5).chain(s.iter())
.collect::<Vec<_>>();
Выход:
<anon>:23:20: 23:35 error: type mismatch resolving `<core::option::Iter<'_, _> as core::iter::IntoIterator>::Item == _`:
expected &-ptr,
found integral variable [E0271]
<anon>:23 let v = (1..5).chain(s.iter())
^~~~~~~~~~~~~~~
<anon>:23:20: 23:35 help: see the detailed explanation for E0271
<anon>:24:14: 24:33 error: no method named `collect` found for type `core::iter::Chain<core::ops::Range<_>, core::option::Iter<'_, _>>` in the current scope
<anon>:24 .collect::<Vec<_>>();
^~~~~~~~~~~~~~~~~~~
<anon>:24:14: 24:33 note: the method `collect` exists but the following trait bounds were not satisfied: `core::iter::Chain<core::ops::Range<_>, core::option::Iter<'_, _>> : core::iter::Iterator`
error: aborting due to 2 previous errors
Но он отлично работает, когда проносясь:
let s = Some(10);
let v = (1..5).zip(s.iter())
.collect::<Vec<_>>();
Выход:
[(1, 10)]
Почему Ржавчина способна выводить правильные типы для zip
но не f или chain
и как я могу это исправить? нотабене Я хочу, чтобы иметь возможность сделать это для любого итератора, поэтому я не хочу, чтобы решение, которое работает только для Range и Option.
Спасибо за детали. Как вы думаете, каково влияние клонирования здесь? Мне интересно, стоит ли цепляться в таких случаях. –
Влияние производительности, скорее всего, будет совершенно незначительным здесь.Клонирование целого числа является простой побитовой копией, и это то, что компьютеры делают^_ ^. Я добавил еще одно возможное решение. – Shepmaster
Спасибо. Однако вопрос носит общий характер. Я не знаю, как клонирование работает в Rust; просто видя дополнительную стоимость в целом. Альтернатива с 'in_iter' выглядит хорошо - взглянув на реализацию. –