繁体   English   中英

泛型类型不能从泛型元素上的迭代器构建

[英]Generic type cannot be built from iterator over generic elements

我需要一个 function 可以接受一定数量的每个泛型类型的参数,并且能够将操作应用于各个参数。

我目前不工作的测试尝试:

pub fn gen_test<I>(f: fn(I) -> f32) -> f32
where 
    I:IntoIterator+Default,
    <I as IntoIterator>::Item: Add
{
    let start = I::default();
    let plus_one: I = start.into_iter().map(|p|p+p).collect();
    let value:f32 = f(plus_one);
    return value;
}

沿着I是一些结构的思路思考,它包含可能不同类型的多个值并在它们上实现一些迭代器。

例如:

#[derive(Default)]
struct SomeStruct {
    x: u32,
    y: f32
}
// I'm not sure how to implement an iterator across differing types
fn some_function(SomeStruct some_struct) -> f32 {
    (some_struct.x as f32 + some_struct.y)
}
fn main() {
    let value = gen_test(some_function);
}

在这里collect后,我收到错误:

I类型的值不能从<<I as IntoIterator>::Item as Add>::Output类型的元素的迭代器构建I类型的值不能从std::iter::Iterator<Item=<<I as IntoIterator>::Item as Add>::Output>

我怎样才能解决这个问题?

听起来您至少需要 2 个不同的泛型类型参数,因为I可以充当某些T的容器,它可以迭代或从中收集,在这种情况下,我们可以使用这些边界:

use std::iter::FromIterator;
use std::ops::Add;

pub fn gen_test<I, T>(f: fn(I) -> f32) -> f32
where
    I: IntoIterator<Item = T> + Default + FromIterator<T>,
    T: Add<Output = T> + Copy,
{
    let start = I::default();
    let plus_one: I = start.into_iter().map(|p| p + p).collect();
    let value: f32 = f(plus_one);
    value
}

操场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM