generics - 如何从函数返回具有泛型关联类型的迭代器?

标签 generics rust iterator traits parametric-polymorphism

对于这样的函数:

fn generate_even(a: i32, b: i32) -> impl Iterator<Item = i32> {
    (a..b).filter(|x| x % 2 == 0)
}

我想让它成为通用的,而不是具体类型 i32 我想要任何可范围的类型并提供过滤器实现。

尝试了下面的公式,但没有成功:

fn generate_even(a: T, b: T) -> impl Iterator<Item = T>
    where T: // range + filter + what to put here?
{
    (a..b).filter(|x| x % 2 == 0)
}

如何实现这样的事情?

最佳答案

实际上,通过使用 TryInto 可以支持所有整数类型,包括 i8

use std::ops::Range;
use std::ops::Rem;
use std::cmp::PartialEq;
use std::fmt;
use std::convert::{TryFrom, TryInto};

fn generate_even<T>(a: T, b: T) -> impl Iterator<Item = T>
  where
    Range<T>: Iterator<Item = T>,
    T: Copy + Rem<Output = T> + TryFrom<u8> + PartialEq + fmt::Debug,
    <T as TryFrom<u8>>::Error: fmt::Debug
{
    let zero: T = 0_u8.try_into().unwrap();
    let two: T = 2_u8.try_into().unwrap();
    (a..b).filter(move |&x| x % two == zero)
}

fn main() {
    let even_u8s = generate_even(0_i8, 11_i8);
    let even_u8s = generate_even(0_u8, 11_u8);
    let even_i16s = generate_even(0_i16, 11_i16);
    let even_u16s = generate_even(0_u16, 11_u16);
    // and so on
    let even_u128s = generate_even(0_u128, 11_u128);
}

关于generics - 如何从函数返回具有泛型关联类型的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65064004/

相关文章:

f# - F# 函数的通用版本导致无效的 IL?

rust - 有没有办法在 Rust 中定义多参数特征?

java - Java中TreeMap的并发修改

禁止原始类型的 Javac 标志?

generics - Kotlin 泛型 : counterintuitive type inference and checking with out keyword

c# - 不同泛型的数组

generics - 使用生命周期参数的结果-将生命周期参数的枚举应用于默认T <'a> and E<' a>参数(Rust)

rust - 如何通过 futures:stream::Stream 发送 bytes::bytes::Bytes?

c++ - 检查 std::map 的迭代器是否指向倒数第二个元素

java - 如何在迭代器中引用当前对象