我正在尝试编写一个函数来返回 Vector
的平均值。我希望它与通用类型一起使用,但我在实现它时遇到了一些困难。
extern crate num; // 0.2.0
use num::Zero;
use std::ops::{Add, Div};
pub struct Vector<T> {
pub size: usize,
pub data: Vec<T>,
}
impl<T: Copy + Zero + Add<T, Output = T>> Vector<T> {
pub fn sum(&self) -> T {
self.data.iter().fold(T::zero(), |sum, &val| sum + val)
}
}
impl<T: Copy + Zero + Add<T, Output = T> + Div<T, Output = T>> Vector<T> {
pub fn mean(&self) -> T {
let sum = self.sum();
sum / self.data.len()
}
}
上面的例子不能编译因为 self.data.len()
是一个 usize
而 sum
是 类型T
:
error[E0308]: mismatched types
--> src/lib.rs:20:15
|
20 | sum / self.data.len()
| ^^^^^^^^^^^^^^^ expected type parameter, found usize
|
= note: expected type `T`
found type `usize`
我知道我可以将签名更改为:
impl<T: Copy + Zero + Add<T, Output = T> + Div<usize, Output = T>> Vector<T>
它会编译——但这不是为 Rust 基本类型实现的。我该怎么办?
最佳答案
原始类型实现 the FromPrimitive
trait , 在 the num
crate 中定义, 以允许原始类型之间的转换,包括 usize
。我们可以在函数上添加一个 FromPrimitive
绑定(bind),然后我们可以将 usize
转换为 T
:
extern crate num; // 0.2.0
use num::{FromPrimitive, Zero};
use std::ops::{Add, Div};
impl<T> Vector<T>
where
T: Copy + Zero + Add<T, Output = T> + Div<T, Output = T> + FromPrimitive,
{
pub fn mean(&self) -> T {
let sum = self.sum();
sum / FromPrimitive::from_usize(self.data.len()).unwrap()
}
}
关于generics - 为泛型类型实现均值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247038/