【发布时间】:2020-03-22 04:25:50
【问题描述】:
我为u32 写了一个长度函数。我可以轻松地复制/粘贴/编辑到其他 int 类型,但是当我尝试使用泛型时,我遇到了困难。有没有我误解的概念?
传递长度函数
fn len_int(n: u32) -> u32 { // 0
std::iter::repeat_with({
let mut l = 0;
// can't call pow on ambiguous numeric type
move || match n / 10u32.pow(l) { // 1
0 => 0,
_ => {
l += 1;
1
}
}
})
.take_while(|&x| x != 0)
// count returns usize
.count() as u32 // 2
}
一个失败的通用长度函数:I
fn len_int<T>(n: T) -> T
where
T: Copy + Clone,
{
std::iter::repeat_with({
let mut l = 0;
move || match n / 10.pow(l) {
//1
0 => 0,
_ => {
l += 1;
1
}
}
})
.take_while(|&x| x != 0)
.count() at T // 2
}
编译器告诉我不能
call method pow on ambiguous numeric type {integer}
cannot divide T by type error
或者在末尾用as T 转换count(),因为T 不是原始类型。
playground
【问题讨论】:
-
它是如何/在哪里失败的?包括错误消息和详细信息。
-
提供的游乐场链接导致完全不同的代码......
-
@jmb,对不起,这似乎有时会发生,忘记检查它。现在可以了。
-
请参阅stackoverflow.com/questions/26810793/… 以了解如何处理通用整数类型。此外,一些指数数学告诉我,无论你传入什么整数,你永远不会溢出
usize,这就是.count()返回的内容。因此,你真的应该只返回usize。 -
另外,计算一个数字在给定基数(在本例中为 10)中所占位数的最简单方法是计算该数字在所述基数中的对数。在这种情况下,记录以 x 为底的十。然后,取其上限使其成为一个整数。示例:play.rust-lang.org/…