Как насчет этого:
use std::iter::Sum;
fn main() {
let err = "Slice is empty.";
// Test vector of integers
let numbers = vec![10i32, -21, 15, 20, 18, 14, 18];
println!("Mean is {:.3}", mean(numbers.into_iter()).expect(err));
// Test vector of floating point numbers
let numbers = vec![10f64, -21f64, 15f64, 20f64, 18f64, 14f64, 18f64];
println!("Mean is {:.3}", mean(numbers.into_iter()).expect(err));
// Test empty vector
let numbers: Vec<i32> = Vec::new();
println!("Mean is {:.3}", mean(numbers.into_iter()).expect(err));
}
fn mean<T, I: Iterator<Item = T>>(iter: I) -> Option<f64>
where
T: Into<f64> + Sum<T>,
{
let mut len = 0;
let sum = iter
.map(|t| {
len += 1;
t
})
.sum::<T>();
match len {
0 => None,
_ => Some(sum.into() / len as f64)
}
}
Тот же код на площадке Rust
Похоже, что имеет следующие преимущества перед ответами, опубликованными до сих пор:
- Гораздо проще определение родового типа.
- Не зависит от внешнего
num
ящика.
- Нет необходимости в трудно угадываемых чертах, таких как
FromPrimitive
и Zero
.
- Нет ручных деклараций времени жизни.
Или эта версия, которая имеет следующие отличия от приведенной выше:
- Может принимать массивы, а не векторы.
- Не использует массив (или вектор).
- Требуется ручное объявление срока службы.
use std::iter::Sum;
fn main() {
let err = "Slice is empty.";
// Test aray of integers
let numbers = [10, -21, 15, 20, 18, 14, 18];
println!("Mean is {:.3}", mean(numbers.iter()).expect(err));
// Test array of floating point numbers
let numbers = [10f64, -21f64, 15f64, 20f64, 18f64, 14f64, 18f64];
println!("Mean is {:.3}", mean(numbers.iter()).expect(err));
// Test empty array
let numbers: [i32; 0] = [];
match mean(numbers.iter()) {
Some(mean_) => println!("Mean is {:.3}", mean_),
None => println!("Empty array"),
}
}
fn mean<'a, T, I>(iter: I) -> Option<f64>
where
T: Into<f64> + Sum<&'a T> + 'a,
I: Iterator<Item = &'a T>,
{
let mut len = 0;
let sum = iter
.map(|t| {
len += 1;
t
})
.sum::<T>();
match len {
0 => None,
_ => Some(sum.into() / len as f64),
}
}
Спасибо моему другу Свену за вклад кода.