generics - 为泛型类型实现均值函数

标签 generics rust

我正在尝试编写一个函数来返回 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()
    }
}

Playground .

上面的例子不能编译因为 self.data.len() 是一个 usizesum 类型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/

相关文章:

Java 泛型 : interface method that receives type argument of implementing class

Java 泛型和 Infinity(比较)

generics - 在泛型类中使用类型变量作为返回类型

rust - 使用格式时,如何在正 float 之前强制使用 '+' 符号!宏观?

java - 通用语法符号 <~>

c# - 我怎样才能使这个通用接口(interface)更具类型化?

rust - 从 rs-GTK 中的 GTK::Entry 获取输入

rust - 如何使用 Rust 在运行时识别浮点精度?

rust - 模式匹配 float 的替代方案是什么?

pointers - 在跨 FFI 边界调用的函数中使用引用代替指针是否安全?