Как связать тип Iterator :: Item?

Я не уверен, как указать ограничения на тип вывода итератора для общих итераторов. До Rust 1.0 раньше я мог это сделать:

fn somefunc<A: Int, I: Iterator<A>>(xs: I) {
    xs.next().unwrap().pow(2);
}

Но сейчас, я не знаю, как поставить ограничения на итератор Item типа.

fn somefunc<I: Iterator>(xs: I) {
    xs.next().unwrap().pow(2);
}
error: no method named 'pow' found for type '<I as std::iter::Iterator>::Item' in the current scope
 --> src/main.rs:2:28
  |
2 |         xs.next().unwrap().pow(2);
  |                            ^^^

Как я могу заставить это работать?

Ответы

Ответ 1

Вы можете ввести второй тип типового типа и поместить на него следующую привязку:

fn somefunc<A: Int, I: Iterator<Item = A>>(mut xs: I) {
    xs.next().unwrap().pow(2);
}

Вы также можете установить границы признаков для самого связанного типа

fn somefunc<I: Iterator>(mut xs: I)
where
    I::Item: Int,
{
    xs.next().unwrap().pow(2);
}