为所有原始整数类型定义功能的惯用方式

时间:2019-03-01 23:41:19

标签: generics rust macros

我有一个为i64定义的函数,该函数返回一个数字的迭代器。

Playground

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);
    }
}

我想以某种方式对所有原始整数类型进行概括,但是我想不出一种很好的方法。

一种解决方案是为每个原语手动实现该功能,该功能虽然有效,但会大量复制粘贴。

另一种(不受欢迎的)解决方案是仅对i128u128实施两次,在这里我总是可以转换较小的类型并按以下方式调用它:

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

我尝试使用泛型(例如T: Integer + Div + Rem等)来实现它,但是我无法像使用原始类型一样进行泛型转换:num as f64

我倾向于使用macro_rules!(也许使用exprty)来做到这一点,但是我对Rust中的宏还是很陌生的。任何指导将不胜感激。

0 个答案:

没有答案