当前位置:  开发笔记 > 后端 > 正文

实现泛型类型的均值函数

如何解决《实现泛型类型的均值函数》经验,为你挑选了1个好方法。

我正在尝试编写一个函数来返回a的平均值Vector.我希望它与泛型类型一起工作,但我在实现它时遇到了一些困难.

extern crate num; // 0.2.0

use num::Zero;
use std::ops::{Add, Div};

pub struct Vector {
    pub size: usize,
    pub data: Vec,
}

impl> Vector {
    pub fn sum(&self) -> T {
        self.data.iter().fold(T::zero(), |sum, &val| sum + val)
    }
}

impl + Div> Vector {
    pub fn mean(&self) -> T {
        let sum = self.sum();
        sum / self.data.len()
    }
}

游乐场.

上面的例子中不编译为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 + Div> Vector

它会编译 - 但这不是针对Rust原始类型实现的.我该怎么办呢?



1> Francis Gagn..:

原始类型实现的FromPrimitive性状,所限定的num板条箱,以允许原始类型之间的转换,包括usize.我们可以FromPrimitive在函数上添加一个绑定,然后我们可以将其转换usizeT:

extern crate num; // 0.2.0

use num::{FromPrimitive, Zero};
use std::ops::{Add, Div};

impl Vector
where
    T: Copy + Zero + Add + Div + FromPrimitive,
{
    pub fn mean(&self) -> T {
        let sum = self.sum();
        sum / FromPrimitive::from_usize(self.data.len()).unwrap()
    }
}

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有