我正在尝试编写一个函数,它接受一段数字并计算平均值。
我尝试使用来自 Implementing mean function for generic types 的想法但出现错误。
我的代码是:
extern crate num;
use num::{FromPrimitive, Zero};
use std::ops::{Add, Div};
fn main() {
let mut numbers = [10, -21, 15, 20, 18, 14, 18];
let err = "Slice is empty.";
println!("Mean is {:.3}", mean(&numbers).expect(err));
}
fn mean<T>(numbers: &[T]) -> Option<f64>
where
T: Copy + Zero + Add<T, Output = T> + Div<T, Output = T> + FromPrimitive,
{
match numbers.len() {
0 => None,
_ => {
let sum = numbers.iter().sum: ();
let length = FromPrimitive::from_usize(numbers.len()).unwrap();
Some(sum / length)
}
}
}
错误是:
error[E0658]: type ascription is experimental (see issue #23416)
--> src/main.rs:20:23
|
20 | let sum = numbers.iter().sum: ();
| ^^^^^^^^^^^^^^^^^^^^^^
有没有什么方法可以在不使用实验性特征的情况下编写通用均值函数?
最佳答案
您在通用函数中执行了 2 个不同的操作:
- 对 slice 中的所有值求和:您需要通过添加
Sum<T>
来表明您的元素是可求和的泛型类型参数的边界。 - 2 个元素的除法运算: 您的泛型需要转换为
f64
或您要限制的任何浮点类型。由于您使用的是 num crate,我添加了ToPrimitive
作为边界,它告诉您可以将泛型类型转换为原始类型。
这里是实现:
fn mean<'a, T: 'a>(numbers: &'a [T]) -> Option<f64>
where
T: ToPrimitive + Sum<&'a T>,
{
match numbers.len() {
0 => None,
_ => {
let sum = numbers.iter().sum::<T>();
let length = f64::from_usize(numbers.len())?;
T::to_f64(&sum).map(|sum| sum / length)
}
}
}
关于generics - 均值函数的 Rust 泛型语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54168352/