首页 > 解决方案 > 为所有原始整数类型定义功能的惯用方式

问题描述

我定义了一个函数,i64它返回一个迭代数字的迭代器。

游乐场

fn digits_of(num: i64) -> impl Iterator<Item = u8> {
    let num = num.abs();
    let nth_digit = move |exp| (num / 10_i64.pow(exp) % 10) as u8;
    let largest_exponent = (num as f64).log10() as u32;
    (0..=largest_exponent).into_iter().map(nth_digit).rev()
}

fn main() {
    for digit in digits_of(-8675309) {
        println!("{}", digit);
    }
}

我想以某种方式对所有原始整数类型进行概括,但我想不出一个好的方法来做到这一点。

一种解决方案是为每个原语手动实现该功能,这会起作用,但需要大量的复制和粘贴。

另一个(不受欢迎的)解决方案是只为i128and实现两次u128,我总是可以转换一个较小的类型并通过以下方式调用它:

fn main() {
    let x: u8 = 10;
    for digit in digits_of(x as u128) {
        println!("{}", digit);
    }
}

我曾尝试使用泛型、whereT: Integer + Div + Rem等来实现它,但我不能像使用原语那样转换泛型:num as f64

macro_rules!我的倾向是(也许使用exprand )这可能是可能的ty,但我对 Rust 中的宏很陌生。任何指导将不胜感激。

标签: genericsrustmacros

解决方案


推荐阅读