我有一个为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);
}
}
我想以某种方式对所有原始整数类型进行概括,但是我想不出一种很好的方法。
一种解决方案是为每个原语手动实现该功能,该功能虽然有效,但会大量复制粘贴。
另一种(不受欢迎的)解决方案是仅对i128
和u128
实施两次,在这里我总是可以转换较小的类型并按以下方式调用它:
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!
(也许使用expr
和ty
)来做到这一点,但是我对Rust中的宏还是很陌生的。任何指导将不胜感激。