function - 无法从通用元素的迭代器构建通用类型

标签 function generics rust iterator traits

我需要一个函数,该函数可以接受每个泛型类型的一些参数,并且能够将操作应用于单个参数。
我当前无法正常工作的测试尝试:

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时,我得到了错误:

a value of type I cannot be built from an iterator over elements of type <<I as IntoIterator>::Item as Add>::Output value of type I cannot be built from 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
}
playground

关于function - 无法从通用元素的迭代器构建通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65646935/

相关文章:

Javascript 按钮 onclick 函数未定义

c# - 如何从 List<Tuple<int, int, string>> 获取字符串数组?

rust - 如何借用一个展开的 Option<T>?

rust - 如何使用 Rust 在 Substrate 中编码帐户 ID 的十六进制字符串表示?

javascript - 向 "Virtual pet"游戏添加了功能,但我找不到我的错误

javascript - 如何在 Javascript 函数中使用选项对象

python - 编写一个带有 2 个字符串参数的函数

Java 如何将泛型参数声明为任意接口(interface)

java - 如何获取类型为 T 的字段的类?

rust - 如何将 yaml-rust 枚举存储到结构的实例中?