实际代码:
extern crate num_traits;
pub trait DigitCount {
fn decimal_digit_count(&self) -> usize;
}
impl <T: PartialOrd + num_traits::Zero + Into<f64>> DigitCount for T {
fn decimal_digit_count (&self) -> usize {
if self.is_zero() {
1
} else {
self.into().abs().log10().trunc() as usize + 1
}
}
}
必须对任何整数值调用该方法decimal_digit_count并返回其中的小数位数:
println!("{}", 123u64.decimal_digit_count());
问题:如何正确编写转换T→用于方法的f64后续调用abs,,,?在其当前形式中,编译器需要一个类型注释,但如果它被替换为 ( ),它表示需要 0 个类型参数。log10truncinto()into::<T>()
方法本身并没有真正的类型参数,因为 trait 有一个:
第一个修复是通过一个中间变量简单地明确指出我们想要结束的类型:
(游戏围栏)
第二种选择是使用 UFCS 形式的方法调用,并
T为特征显式表示:(游戏围栏)
以防万一,我将补充一点,
f64并非所有整数类型都实现了转换。这样的转换必须始终成功,这是不可能的,例如,因为u64或i128因为无法容纳整个值范围。