【发布时间】:2019-01-13 11:23:45
【问题描述】:
我正在尝试编写一个函数,该函数接受一段数字并计算平均值。
我尝试使用来自 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: ();
| ^^^^^^^^^^^^^^^^^^^^^^
有没有什么方法可以在不使用实验特性的情况下编写通用的均值函数?
【问题讨论】:
-
你链接的问题不建议写
sum: ()。这在今天的 Rust 中不是有效的语法,我只能假设它是一个错字 -
尝试自己推断
length和sum的类型。你会明白为什么编译器不能做到这一点。剧透:可能有很多类型实现了num::FromPrimitive。并且可能有许多类型实现了std::iter::Sum<&T>。就像可能有很多类型实现了std::ops::Div<_, Output = f64>(这里的_是因为无法推断length的类型)。 -
要使推理起作用,您必须确保没有歧义。