首页 > 解决方案 > 在 Array1 上创建一个泛型方法

问题描述

我有以下 Trait 实现,并希望unit通用 over Array1<T>,但未能找到正确的 Trait 边界(尤其是这对我来说似乎微不足道,所有 T 需要支持的基本上是输出 T 以使函数工作的基本算术) .

trait Unit {
    fn unit(&self) -> Array1<f32>;
}

impl Unit for Array1<f32> 
{
    fn unit(&self) -> Array1<f32> {
        self / (self * self).sum().sqrt()
    }
}

编译器建议添加std::ops::Mul<Output = &ArrayBase<OwnedRepr<T>, Dim<[usize; 1]>>>,但这样做会一遍又一遍地给出相同的错误。

操场

标签: genericsrustrust-ndarray

解决方案


我遵循编译器错误消息并生成了这个可编译的通用代码。我不熟悉,ndarray所以我不知道这是否真的正确。

use std::ops::Mul;
use num_traits::{Zero, real::Real};
use ndarray::prelude::*;

trait Unit {
    type Output;
    fn unit(&self) -> Array1<Self::Output>;
}

impl<T> Unit for Array1<T>
where
    for<'a> &'a Array1<T>: Mul<Output = Array1<T>>,
    T: Real + Clone + Zero + ndarray::ScalarOperand,
{
    type Output = T;
    fn unit(&self) -> Array1<T> {
        self / (self * self).sum().sqrt()
    }
}

请注意,Unit现在返回关联类型。如果您希望它始终返回f32,那么您也需要要求它T也可以转换为f32


推荐阅读