Rust 将usize转换为f32
我实现了以下计算序列平均值的函数:Rust 将usize转换为f32,rust,Rust,我实现了以下计算序列平均值的函数: fn mean<T, R>(seq: &[T]) -> R where R: Div<R, Output=R> + From<T> + From<usize> + Sum<R> { let total: R = seq.iter().map(|&x| R::from(x)).sum() let size = R::from(seq.len()) t
fn mean<T, R>(seq: &[T]) -> R
where R: Div<R, Output=R> + From<T> + From<usize> + Sum<R>
{
let total: R = seq.iter().map(|&x| R::from(x)).sum()
let size = R::from(seq.len())
total / size
}
5 | fn均值(序列:&[T])->R
| ----
6 |式中R:Div+From+From+Sum
|--------此界限要求的“平均值”`
...
15 | let结果:f32=平均值(和数字);
|^f32未实现特性“std::convert::From”`
由于我还是一个性格特征的初学者,所以我对此感到十分困惑。我如何解决这个具体问题?(如果可以)不可能以
f32
格式表示所有可能的i32
值。
这就是为什么为f32
提供的trait实现中的仅支持i16
/u16
/i8
/u8
i32
和f32
具有相同的字节数,但通常f32为指数花费的字节数很少,因此它不能表示i32
中的所有数字 问题在于f32
没有实现来自的。它确实实现了来自
的、来自
的、来自
的和来自的。这是因为
f32`不能精确表示较大整数的所有值
您可能希望将用作
转换,这会导致精度损失。不幸的是,您不能在泛型类型上使用as
,只能在基元类型上使用
您可以编写一个trait来手动执行所有必要的转换。。。但当然,这是有原因的!使用num\u traits::cast::asprimitive
您的代码将变成:
fn mean<T, R>(seq: &[T]) -> R
where R: Div<R, Output=R> + Sum<R> + Copy + 'static,
T: AsPrimitive<R>,
usize: AsPrimitive<R>
{
let total: R = seq.iter().map(|&x| x.as_()).sum();
let size = seq.len().as_();
total / size
}
fn平均值(序列:&[T])->R
其中R:Div+Sum+Copy+static,
T:基本的,
usize:AsPrimitive
{
设total:R=seq.iter().map(|&x|x.as|()).sum();
设大小=序号len().as_u2;;
总数/尺寸
}
我已经添加了Copy
约束,我认为您在代码中遗漏了该约束,以及R
的静态约束,该约束是asiprimitive
所必需的。请在回答问题之前搜索重复项并标记为重复项。请在回答问题之前搜索重复项并标记为重复项。
5 | fn mean<T, R>(seq: &[T]) -> R
| ----
6 | where R: Div<R, Output=R> + From<T> + From<usize> + Sum<R>
| ----------- required by this bound in `mean`
...
15 | let result: f32 = mean(&numbers);
| ^^^^ the trait `std::convert::From<usize>` is not implemented for `f32`
fn mean<T, R>(seq: &[T]) -> R
where R: Div<R, Output=R> + Sum<R> + Copy + 'static,
T: AsPrimitive<R>,
usize: AsPrimitive<R>
{
let total: R = seq.iter().map(|&x| x.as_()).sum();
let size = seq.len().as_();
total / size
}