Вам нужна граница черты Iterator<Item = &OtherStruct>
, так как Vec<T>::iter
возвращает итератор с ссылками на T
. Итератор, производящий значения T
, должен был бы переместить их из вектора, что безопасно только в том случае, если сам вектор используется, и это то, что Vec<T>::into_iter()
делает.
Обратите внимание, что вам также необходимоукажите время жизни ссылки, привязанное к времени жизни данных:
fn some_function<'a, I>(data: I)
where
I: Iterator<Item = &'a Other> + 'a,
{
for el in data {
println!("{:?}", el)
}
}
Полный пример на игровой площадке .
Наконец, стоит отметить, что в целомпредпочтительно запрашивать IntoIterator
, а не Iterator
. Поскольку Iterator
реализует IntoIterator
, такая функция будет продолжать принимать итераторы, но также будет принимать объекты, которые могут быть преобразованы в итераторы. В этом случае он будет принимать &s.data
в дополнение к s.data.iter()
.